1. 程式人生 > >[李景山php] 擴充套件解析

[李景山php] 擴充套件解析

// 包含 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; // 返回成功 }