php擴充開發筆記(2)多個原始碼檔案的配置和編譯

來源:互聯網
上載者:User

標籤: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)多個原始碼檔案的配置和編譯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.