[李景山php] 擴充套件解析
阿新 • • 發佈:2018-12-31
// 包含 php 系列配套檔案
#ifdef HAVE_CONFIG_H
#include "config.h" // 包含配置檔案
#endif
#include "php.h" // 包含 php的標頭檔案
#include "php_ini.h" // 包含php初始化配置檔案
#include "ext/standard/info.h" // 包含標準擴充套件頭資訊
#include "php_dio.h"// 包含自己擴充套件的標頭檔案
// 包含 C語言需要的 庫檔案
#include <sys/stat.h> // 包含 stat 檔案
#include <sys/types.h>// 包含 types 檔案
#ifdef HAVE_UNISTD_H // 包含 unistd 檔案
#include <unistd.h> // 包含 unistd 標頭檔案
#endif
#include <fcntl.h>// 包含控制檔案
#ifndef PHP_WIN32
#include <termios.h> // 包含 termios.h 如果是 PHP_WIN32 程式
#endif
/* e.g. IRIX does not have CRTSCTS */
#ifndef CRTSCTS// 定義了 CRTSCTS
# ifdef CNEW_RTSCTS // 定義 CNEW_RTSCTS 型別
# define CRTSCTS CNEW_RTSCTS
# else
# define CRTSCTS 0
# endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */
#define le_fd_name "Direct I/O File Descriptor" // 巨集定義
static int le_fd;// 靜態整型 型別
//function_entry 函式宣告
function_entry dio_functions[] = { // 函式宣告
PHP_FE(dio_open, NULL) // 定義 dio_open
#ifndef PHP_WIN32 // 如果是 PHP_WIN32
PHP_FE(dio_truncate, NULL) // 定義 dio_truncate
#endif
PHP_FE(dio_stat, NULL) // 定義 dio_stat
PHP_FE(dio_seek, NULL) // 定義 dio_seek
#ifndef PHP_WIN32
PHP_FE(dio_fcntl, NULL) // 定義 dio_fcntl
#endif
PHP_FE(dio_read, NULL) // 定義 dio_read
PHP_FE(dio_write, NULL) // 定義 dio_write
PHP_FE(dio_close, NULL) // 定義 dio_close
#ifndef PHP_WIN32
PHP_FE(dio_tcsetattr, NULL) // 定義 dio_tecsetattr
#endif
{NULL, NULL, NULL}
};
//zend_module_entry 模型初始化說明
zend_module_entry dio_module_entry = {
STANDARD_MODULE_HEADER,// 標準 頭資訊
"dio",// 自定義
dio_functions,// 自定義函式
PHP_MINIT(dio),// 初始化 MINIT 函式 dio
NULL,// 空
NULL, // 空
NULL,// 空
PHP_MINFO(dio),// 獲取資訊
PHP_DIO_VERSION,// DIO 版本資訊
STANDARD_MODULE_PROPERTIES// 標準模組效能
};
#ifdef COMPILE_DL_DIO
ZEND_GET_MODULE(dio)// 包含系統型別
#endif
// _dio_close_fd 關閉函式,
// zend_rsrc_list_entry 系統資源
// 執行緒安全問題 TSRMLS_DC
static void _dio_close_fd(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
php_fd_t *f = (php_fd_t *) rsrc->ptr;
if (f) {
close(f->fd);
free(f);
}
}// 此函式 預設的功能,就是 釋放php分配的系統資源。
#define RDIOC(c) REGISTER_LONG_CONSTANT(#c, c, CONST_CS | CONST_PERSISTENT)
#define DIO_UNDEF_CONST -1
// 各種巨集定義
// 各種巨集定義 型別
PHP_MINIT_FUNCTION(dio)
{// 初始化 dio 資料
le_fd = zend_register_list_destructors_ex(_dio_close_fd, NULL, le_fd_name, module_number);
// 新的函式,資源型別的建立
RDIOC(O_RDONLY);// 檔案操作宣告 預設
RDIOC(O_WRONLY);
RDIOC(O_RDWR);
RDIOC(O_CREAT);
RDIOC(O_EXCL);
RDIOC(O_TRUNC);
RDIOC(O_APPEND);
#ifdef O_NONBLOCK // 情況1
RDIOC(O_NONBLOCK);
#endif
#ifdef O_NDELAY // 情況2
RDIOC(O_NDELAY);
#endif
#ifdef O_SYNC // 情況3
RDIOC(O_SYNC);
#endif
#ifdef O_ASYNC // 情況4
RDIOC(O_ASYNC);
#endif
#ifdef O_NOCTTY // 情況 5
RDIOC(O_NOCTTY);
#endif
#ifndef PHP_WIN32 // 情況 6
RDIOC(S_IRWXU);
RDIOC(S_IRUSR);
RDIOC(S_IWUSR);
RDIOC(S_IXUSR);
RDIOC(S_IRWXG);
RDIOC(S_IRGRP);
RDIOC(S_IWGRP);
RDIOC(S_IXGRP);
RDIOC(S_IRWXO);
RDIOC(S_IROTH);
RDIOC(S_IWOTH);
RDIOC(S_IXOTH);
RDIOC(F_DUPFD);
RDIOC(F_GETFD);
RDIOC(F_GETFL);
RDIOC(F_SETFL);
RDIOC(F_GETLK);
RDIOC(F_SETLK);
RDIOC(F_SETLKW);
RDIOC(F_SETOWN);
RDIOC(F_GETOWN);
RDIOC(F_UNLCK);
RDIOC(F_RDLCK);
RDIOC(F_WRLCK);
#endif
return SUCCESS; // 返回成功
}