怎麼寫php的擴充套件

2020-07-16 10:05:34
為什麼要用C擴充套件

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其它相關文章!