為什麼要用C擴充
C是靜態編譯的,執行效率比PHP程式碼高很多。同樣的運算程式碼,使用C來開發,效能會比PHP要提升數百倍。 IO操作如CURL,因為耗時主要在IOWait上,C擴充沒有明顯優勢。
另外C擴充功能是在進程啟動時載入的,PHP程式碼只能操作Request生命週期的數據,C擴充可操作的範圍更廣。
推薦課程:PHP教學。
第一步
下載PHP的原始碼,如php-5.4.16。解壓縮後進入php-5.4.16\ext目錄。輸入 ./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的擴展的詳細內容。更多資訊請關注PHP中文網其他相關文章!