1. 程式人生 > >php擴展開發筆記(2)多個源代碼文件的配置和編譯

php擴展開發筆記(2)多個源代碼文件的配置和編譯

nes repr 過程 http fadein ews add ng- star

我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼文件的,而不不過通過 ext_skel 生成得骨架文件。

這篇文章主要介紹下。多個代碼文件的時候。我們須要註意什麽,以及怎麽做。

我的代碼文件例如以下(slash為我的擴展名)

// ext_skel 生成默認得模塊相關的主要文件
php_slash.h // 頭文件
slash.c // 源代碼文件
config.m4 // 編譯的時候須要改動的文件

在這個默認生成的骨架文件中面,我們只要運行以下幾步,就能夠完畢一個新的擴展了。

刪除config.m4的第1012行開頭的凝視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)多個源代碼文件的配置和編譯