php擴展開發筆記(2)多個源代碼文件的配置和編譯
我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼文件的,而不不過通過 ext_skel 生成得骨架文件。
這篇文章主要介紹下。多個代碼文件的時候。我們須要註意什麽,以及怎麽做。
我的代碼文件例如以下(slash為我的擴展名)
// ext_skel 生成默認得模塊相關的主要文件
php_slash.h // 頭文件
slash.c // 源代碼文件
config.m4 // 編譯的時候須要改動的文件
在這個默認生成的骨架文件中面,我們只要運行以下幾步,就能夠完畢一個新的擴展了。
刪除config.m4的第10-12行開頭的凝視dnl
phpize
./configure
make && 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_H
extern 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)多個源代碼文件的配置和編譯