標籤:int red proc mac art data his 而且 ifd
我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼檔案的,而不不過通過 ext_skel 產生得骨架檔案。
這篇文章主要介紹下。多個代碼檔案的時候。我們須要注意什麼,以及怎麼做。
My Code檔案例如以下(slash為我的副檔名)
// ext_skel 產生預設得模組相關的主要檔案php_slash.h // 標頭檔slash.c // 原始碼檔案config.m4 // 編譯的時候須要改動的檔案
在這個預設產生的骨架檔案中面,我們只要運行以下幾步,就能夠完畢一個新的擴充了。
刪除config.m4的第10-12行開頭的凝視dnlphpize./configuremake && make install
通過上面的步驟,我們就完畢了一個擴充,通過 dl(“slash.so”);的方式就能夠進行測試了。假設編寫一個類在上一篇文章裡有介紹。
以下我們介紹添加新的類和原始碼檔案以及怎樣編譯配置等。
添加一個新的php類(Slash_Http_Util),而且給該類添加一個 getIv 的方法,php代碼測試代碼例如以下:
$httpUtil = new Slash_Http_Util();$httpUtil->getIv(); // 會輸出 HELLO
原始碼檔案 slash_http_util.h
#ifndef SLASH_HTTP_UTIL_H#define SLASH_HTTP_UTIL_Hextern zend_class_entry *slash_http_util_ce;PHP_METHOD(slash_http_util, getIv);SLASH_MINIT_FUNCTION(http_util);#endif
原始碼檔案 slash_http_util.c
#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_ini.h" /* for zend_alter_ini_entry */#include "php_slash.h"#include "slash_http_util.h"zend_class_entry *slash_http_util_ce;PHP_METHOD(slash_http_util, getIv) { php_printf("HELLO"); RETURN_TRUE;}zend_function_entry slash_http_util_methods[] = { ZEND_ME(slash_http_util, getIv, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_FE_END};SLASH_MINIT_FUNCTION(http_util) { zend_class_entry ce; SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_HTTP_UTIL, slash_http_util_methods); slash_http_util_ce = zend_register_internal_class(&ce TSRMLS_CC); return SUCCESS;}
以上的代碼完畢了新類的加入。而且給該類添加了一個叫 getIv 的方法。
以下須要改動我的 config.m4 設定檔,添加 slash_http_util.c 這個檔案。
開啟 config.m4 到最後倒數第二行。預設 ext_skel 產生的程式碼是
PHP_NEW_EXTENSION(slash,slash.c,$ext_shared)
改動,添加 slash_http_util.c 這個檔案,須要注意的是兩個 *.c 檔案之間是空格,沒有標點符號
PHP_NEW_EXTENSION(slash,slash.c slash_http_util.c, $ext_shared)
完畢 config.m4 的改動以後,還須要去改動 slash.c 這個檔案,預設情況下在這個檔案中會有以下的代碼
PHP_MINIT_FUNCTION(slash){ /* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */ return SUCCESS;}
我們須要把我們新建立的這個類載入進來
PHP_MINIT_FUNCTION(slash){ /* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */ SLASH_STARTUP(http_util); return SUCCESS;}
通過這幾步,新的類就全然建立成功了,你能夠通過 phpize、configure、make 來編譯這個模組了。最後通過我們開始制定的目標進行測試。
幾個須要注意的問題:
1. 改動 config.m4 檔案,添加原始碼檔案
2. 改動 config.m4 檔案以後。須要又一次運行 phpize && ./configure && make
3. 在模組(slash.c檔案)載入函數中 PHP_MINIT_FUNCTION 加入這個新的類。
上面的代碼中假設你全然copy可能沒辦法通過編譯,由於我自己定義重新命名了幾個宏(php_slash.h)。實際開發中你能夠zend的宏。
#define SLASH_CN_HTTP_UTIL "Slash_Http_Util"// {{{ php life cycle redefine#define SLASH_MINIT_FUNCTION(module) PHP_MINIT_FUNCTION(slash_##module)#define SLASH_MSHUTDOWN_FUNCTION(module) PHP_MSHUTDOWN_FUNCTION(slash_##module)#define SLASH_RINIT_FUNCTION(module) PHP_RINIT_FUNCTION(slash_##module)#define SLASH_RSHUTDOWN_FUNCTION(module) PHP_RSHUTDOWN_FUNCTION(slash_##module)#define SLASH_STARTUP(module) PHP_MODULE_STARTUP_N(slash_##module)(INIT_FUNC_ARGS_PASSTHRU)// }}}// {{{ class init mac#define SLASH_INIT_CLASS_ENTRY(ce, name, methods) INIT_CLASS_ENTRY(ce, name, methods)// }}}
以上代碼僅供參考,歡迎交流。
php擴充開發筆記(2)多個原始碼檔案的配置和編譯