摘要:對于每個(gè)來說,都有著內(nèi)心的一種希望寫擴(kuò)展的沖動(dòng)了吧。然而,缺乏一個(gè)很好的切入點(diǎn)。生成了擴(kuò)展之后,我們會(huì)看到四個(gè)文件和一個(gè)文件夾。雖然大寫的有宏定義,但是為什么會(huì)報(bào)錯(cuò),我也不太清楚了。這個(gè)宏最終會(huì)被翻譯成一個(gè)函數(shù)。
PHP 是用 C 語言寫的。對于每個(gè) PHPer 來說,都有著內(nèi)心的一種希望寫擴(kuò)展的沖動(dòng)了吧。然而,缺乏一個(gè)很好的切入點(diǎn)。Google 上搜 PHP 擴(kuò)展開發(fā),大部分都是復(fù)制品文章,甚至有些人連操作都沒有操作過就搬運(yùn)在了自己的博客。不過也有幾篇好教程,但是都是 PHP 5 時(shí)代的產(chǎn)物,隱藏著非常多的坑。我會(huì)將我自己慢慢踩坑的過程記錄下來,也許這就成了其它人的“教程”了吧。
生成一個(gè)擴(kuò)展想必很多人已經(jīng)看到很多網(wǎng)上的教程了。大多都是教我們執(zhí)行這個(gè)命令:$ ./ext_skel --extname=extname。但是,當(dāng)你 clone 了 PHP 源碼后會(huì)發(fā)現(xiàn),master 分支下并沒有 ext/ext_skel 這個(gè)文件。所以,我總結(jié)了一下:
如果你是直接下載 PHP 的源碼,或者在已經(jīng) release 的版本分之下,你可以執(zhí)行這個(gè)命令
$ cd ext $ ./ext_skel --extname=extname
如果你是直接在 master 分支下,只有 ext_skel.php 文件,這個(gè)時(shí)候你就直接可以執(zhí)行這個(gè) PHP 文件
$ cd ext $ php ext_skel.php --ext extname
由于我是直接在 master 分支下開發(fā)的,所以后面的都是默認(rèn)在 master 分之下的操作。
生成了擴(kuò)展之后,我們會(huì)看到四個(gè)文件和一個(gè)文件夾。現(xiàn)在這個(gè)階段,我們只需要用到兩個(gè)文件,.c 文件和 .h 文件。
一個(gè)小坑在我們生成好擴(kuò)展之后,我們可以試著編譯一下
$ phpize $ ./configure $ make && make test
我們會(huì)驚訝地發(fā)現(xiàn),編譯的時(shí)候會(huì)有一個(gè) warning。
warning: implicit declaration of function "ZEND_PARSE_PARAMETERS_NONE" is invalid in C99 [-Wimplicit-function-declaration] ZEND_PARSE_PARAMETERS_NONE(); ^ 1 warning generated.
然后你再執(zhí)行 make test 發(fā)現(xiàn)有一個(gè)測試沒有通過。沒錯(cuò),腳本為我們生成好的文件,居然通不過自己的測試。有沒有覺得很詭異。我們看看 warning 的具體信息。找不到函數(shù) ZEND_PARSE_PARAMETERS_NONE。看了一下文件,發(fā)現(xiàn)在第 15 行??纯催@個(gè)函數(shù)名大概也能猜出來是什么意思了。于是我去 PHP 源碼里搜了一下??墒俏覀儼l(fā)現(xiàn)了這樣一個(gè)宏定義。
#ifndef zend_parse_parameters_none #define zend_parse_parameters_none() zend_parse_parameters(ZEND_NUM_ARGS(), "") #endif
替換掉原來的大寫之后,就沒有 warning 了。這也算是官方給我們挖了一個(gè)小坑吧。雖然大寫的有宏定義,但是為什么會(huì)報(bào)錯(cuò),我也不太清楚了。
定義一個(gè)函數(shù)我想,大多數(shù)人寫擴(kuò)展,肯定至少希望實(shí)現(xiàn)一個(gè)函數(shù),不會(huì)是要幾個(gè)全局變量就去寫個(gè)擴(kuò)展的吧(霧
這里 PHP 給我們提供了一個(gè)有用的宏 PHP_FUNCTION。生成好的代碼里也有定義好的兩個(gè)函數(shù),可以參照它的用法。這個(gè)宏最終會(huì)被翻譯成一個(gè)函數(shù)。例如 PHP_FUNCTION(name) 最終會(huì)被翻譯成 void zif_name(zend_execute_data *execute_data, zval *return_value)
同時(shí)我們看到有定義了這么一個(gè)數(shù)組
const zend_function_entry cesium_functions[] = { PHP_FE(cesium_test1, arginfo_cesium_test1) PHP_FE(cesium_test2, arginfo_cesium_test2) PHP_FE_END };
我們需要將新添加的函數(shù)添加到這個(gè)數(shù)組里。像這樣
const zend_function_entry cesium_functions[] = { PHP_FE(cesium_test1, arginfo_cesium_test1) PHP_FE(cesium_test2, arginfo_cesium_test2) PHP_FE(name, NULL) PHP_FE_END };
記住,結(jié)尾不要加分號(hào)或者逗號(hào)。最后,我們可以個(gè)這個(gè)函數(shù)一個(gè)輸出
PHP_FUNCTION(name) { php_printf("Hello "); }
編譯安裝完了之后我們就可以使用這個(gè)函數(shù)了
總結(jié)本文僅僅是展示了從創(chuàng)建擴(kuò)展開始到運(yùn)行的全過程,本著能運(yùn)行的心態(tài)來走完這些流程。
由于作者水平有限,如有錯(cuò)誤,敬請不吝賜教。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/26087.html
摘要:創(chuàng)建一個(gè)擴(kuò)展的基本步驟都有哪些。執(zhí)行命令后,這樣在當(dāng)前目錄下會(huì)生成一個(gè)與擴(kuò)展名一樣的目錄。文件是用于環(huán)境檢測的。檢測擴(kuò)展編譯運(yùn)行所需的環(huán)境是否滿足。其中,是注釋符號(hào)。去掉注釋后的代碼如下第三步,代碼實(shí)現(xiàn)修改文件。 創(chuàng)建一個(gè)擴(kuò)展的基本步驟都有哪些。示例中,我們將實(shí)現(xiàn)如下功能: 輸出內(nèi)容: $ php ./test.php$ hello word 在擴(kuò)展中實(shí)現(xiàn)一個(gè)say方法,調(diào)用say方...
摘要:既然是從零開始,那么就把作為統(tǒng)一的安裝工具。下面附上安裝方法安裝好之后,就可以開始搭建環(huán)境了。環(huán)境安裝比較簡單安裝好之后,首先要啟動(dòng)服務(wù)。和一起安裝,我們先去安裝,再做相關(guān)配置。成功解析還差一步,就是修改配置文件。 既然是從零開始,那么就把 homebrew 作為統(tǒng)一的安裝工具。如果你不知道 homebrew 是什么東東,移步這里。下面附上 homebrew 安裝方法: /usr/bi...
摘要:既然是從零開始,那么就把作為統(tǒng)一的安裝工具。下面附上安裝方法安裝好之后,就可以開始搭建環(huán)境了。環(huán)境安裝比較簡單安裝好之后,首先要啟動(dòng)服務(wù)。和一起安裝,我們先去安裝,再做相關(guān)配置。成功解析還差一步,就是修改配置文件。 既然是從零開始,那么就把 homebrew 作為統(tǒng)一的安裝工具。如果你不知道 homebrew 是什么東東,移步這里。下面附上 homebrew 安裝方法: /usr/bi...
摘要:要學(xué)習(xí)那么第一步就是要在我們的開發(fā)機(jī)上安裝并運(yùn)行,首先我們會(huì)先安裝再使用框架提供的安裝小工具,通過使用就能生成我們的工程了。在的官方網(wǎng)站上的文檔中已經(jīng)很詳細(xì)的介紹了如何安裝不過文檔可能講解的并不是那么的細(xì)致。從零開始學(xué)系列目錄地址 要學(xué)習(xí)Laravel,那么第一步就是要在我們的開發(fā)機(jī)上安裝并運(yùn)行Laravel,首先我們會(huì)先安裝composer,再使用laravel框架提供的安裝小工具,...
閱讀 1578·2021-09-30 09:57
閱讀 1583·2021-09-09 09:33
閱讀 2368·2021-09-04 16:40
閱讀 1923·2021-09-01 10:50
閱讀 3326·2021-09-01 10:31
閱讀 2626·2019-08-30 15:56
閱讀 3043·2019-08-30 15:44
閱讀 3550·2019-08-29 17:29