C是靜態編譯的,執行效率比PHP程式碼高很多。同樣的運算程式碼,使用C來開發,效能會比PHP要提升數百倍。IO操作如CURL,因為耗時主要在IOWait上,C擴充套件沒有明顯優勢。
另外C擴充套件是在進程啟動時載入的,PHP程式碼只能操作Request生命週期的資料,C擴充套件可操作的範圍更廣。
推薦課程:PHP教學。
第一步
下載PHP的原始碼,如php-5.4.16。解壓後進入php-5.4.16ext目錄。輸入 ./ext_skel –extname=myext,myext就是擴充套件的名稱,執行後生成myext目錄。
ext_skel是PHP官方提供的用於生成php擴充套件骨架程式碼的工具。
cd myext。可以看到php_myext.h、myext.c、config.m4等幾個檔案。config.m4是AutoConf工具的組態檔,用來修改各種編譯選項。
第二步
修改config.m4,將
dnl PHP_ARG_WITH(myext, for myext support, dnl Make sure that the comment is aligned: dnl [ --with-myext Include myext support])
修改為
PHP_ARG_WITH(myext, for myext support, [ --with-myext Include myext support])
下邊還有一個 –enable-myext,是表示編譯到php核心中。with是作為動態連結庫載入的。
第三步
修改php_myext.h,看到PHP_FUNCTION(confirm_myext_compiled); 這裡就是擴充套件函數宣告部分,可以增加一行 PHP_FUNCTION(myext_helloworld); 表示宣告了一個myext_helloworld的擴充套件函數。
然後修改myext.c,這個是擴充套件函數的實現部分。
const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */ };
這的程式碼是將函數指標註冊到Zend引擎,增加一行PHP_FE(myext_helloworld, NULL)(後面不要帶分號)。
第四步
在myext.c末尾加myext_helloworld的執行程式碼。
PHP_FUNCTION(myext_helloworld) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!n"); RETRUN_TRUE; }
zend_parse_parameters是用來接受PHP傳入的引數,RETURN_XXX宏是用來返回給PHP資料。
第五步
在myext目錄下依次執行phpize、./configure 、make、make install。然後修改php.ini加入extension=myext.so
執行php -r 「myext_helloworld(‘test’);」,輸出hello world!
以上就是怎麼寫php的擴充套件的詳細內容,更多請關注TW511.COM其它相關文章!