溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何寫php的擴(kuò)展

發(fā)布時(shí)間:2020-09-17 10:06:19 來源:億速云 閱讀:148 作者:小新 欄目:編程語言

如何寫php的擴(kuò)展?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

 為什么要用C擴(kuò)展

C是靜態(tài)編譯的,執(zhí)行效率比PHP代碼高很多。同樣的運(yùn)算代碼,使用C來開發(fā),性能會(huì)比PHP要提升數(shù)百倍。IO操作如CURL,因?yàn)楹臅r(shí)主要在IOWait上,C擴(kuò)展沒有明顯優(yōu)勢。

另外C擴(kuò)展是在進(jìn)程啟動(dòng)時(shí)加載的,PHP代碼只能操作Request生命周期的數(shù)據(jù),C擴(kuò)展可操作的范圍更廣。

如何寫php的擴(kuò)展

第一步

下載PHP的源代碼,如php-5.4.16。解壓后進(jìn)入php-5.4.16\ext目錄。輸入 ./ext_skel –extname=myext,myext就是擴(kuò)展的名稱,執(zhí)行后生成myext目錄。

ext_skel是PHP官方提供的用于生成php擴(kuò)展骨架代碼的工具。

cd myext??梢钥吹絧hp_myext.h、myext.c、config.m4等幾個(gè)文件。config.m4是AutoConf工具的配置文件,用來修改各種編譯選項(xiàng)。

第二步

修改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])

下邊還有一個(gè) –enable-myext,是表示編譯到php內(nèi)核中。with是作為動(dòng)態(tài)鏈接庫載入的。

第三步

修改php_myext.h,看到PHP_FUNCTION(confirm_myext_compiled); 這里就是擴(kuò)展函數(shù)聲明部分,可以增加一行 PHP_FUNCTION(myext_helloworld); 表示聲明了一個(gè)myext_helloworld的擴(kuò)展函數(shù)。

然后修改myext.c,這個(gè)是擴(kuò)展函數(shù)的實(shí)現(xiàn)部分。

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[] */
};

這的代碼是將函數(shù)指針注冊到Zend引擎,增加一行PHP_FE(myext_helloworld,  NULL)(后面不要帶分號)。

第四步

在myext.c末尾加myext_helloworld的執(zhí)行代碼。

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傳入的參數(shù),RETURN_XXX宏是用來返回給PHP數(shù)據(jù)。

第五步

在myext目錄下依次執(zhí)行phpize、./configure 、make、make install。然后修改php.ini加入extension=myext.so

執(zhí)行php -r “myext_helloworld(‘test’);”,輸出hello world!

感謝各位的閱讀!看完上述內(nèi)容,你們對如何寫php的擴(kuò)展大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI