摘要:簡(jiǎn)單點(diǎn),先來實(shí)現(xiàn)一個(gè)擴(kuò)展的。接下來我們將使用它來生成我們的擴(kuò)展的基本骨架。注意不要添加任何分號(hào)。有興趣的同學(xué)可以自行研究一下靜態(tài)編譯是什么鬼在擴(kuò)展目錄中執(zhí)行命令。一定要在擴(kuò)展的目錄執(zhí)行才有效,否則將得到一個(gè)錯(cuò)誤提示。
簡(jiǎn)單點(diǎn),先來實(shí)現(xiàn)一個(gè)PHP擴(kuò)展的hello world。
注意,以下所有操作都是基于linux系統(tǒng)(推薦centos和ubuntu, Mac系統(tǒng)應(yīng)該類似 ),PHP5.5以上,建議讀者使用5.5以上版本測(cè)試本文例程,PHP內(nèi)核是由C語言寫成的,所以擴(kuò)展基本也是用C/C++編寫。
話不多說,請(qǐng)睇下面:
一、下載PHP源碼到本地目錄
解壓后進(jìn)入PHP源碼的ext目錄,在此目錄下有一個(gè)名為ext_skel的shell腳本文件。接下來我們將使用它來生成我們的擴(kuò)展的基本骨架。當(dāng)然,如果你夠牛也可以不用它,直接自己編寫必要的文件。
二、生成擴(kuò)展的基本骨架
在ext目錄執(zhí)行命令:
./ext_skel --extname=foobar
如果在此目錄沒有寫權(quán)限請(qǐng)自覺加sudo。命令執(zhí)行完畢后輸出:
Creating directory foobar Creating basic files: config.m4 config.w32 .svnignore foobar.c php_foobar.h CREDITS EXPERIMENTAL tests/001.phpt foobar.php [done]. To use your new extension, you will have to execute the following steps: 1. $ cd .. 2. $ vi ext/foobar/config.m4 3. $ ./buildconf 4. $ ./configure --[with|enable]-foobar 5. $ make 6. $ ./sapi/cli/php -f ext/foobar/foobar.php 7. $ vi ext/foobar/foobar.c 8. $ make Repeat steps 3-6 until you are satisfied with ext/foobar/config.m4 and step 6 confirms that your module is compiled into PHP. Then, start writing code and repeat the last two steps as often as necessary.
人品好的話將看到上面的輸出,這表示已成功生成名為foobar的PHP擴(kuò)展的基本骨架,在當(dāng)前目錄生成了一個(gè)foobar的文件夾,我們擴(kuò)展的所有代碼都將放在此目錄下(使用了第三方的庫(kù)的擴(kuò)展另當(dāng)別論)。先別著急弄懂上面提示的內(nèi)容,以后你會(huì)知道的,就像小時(shí)候媽媽經(jīng)常跟你說:等你長(zhǎng)大了就懂了!
三、編輯config.m4文件
ls擴(kuò)展目錄foobar,發(fā)現(xiàn)里面有幾個(gè)文件:
config.m4 config.w32 CREDITS EXPERIMENTAL foobar.c foobar.php php_foobar.h tests
用VIM打開擴(kuò)展目錄下的config.m4文件,找到下面幾行:
16 dnl PHP_ARG_ENABLE(foobar, whether to enable foobar support, 17 dnl Make sure that the comment is aligned: 18 dnl [ --enable-foobar Enable foobar support])
前面的數(shù)字是它所在的行數(shù)(下同),不是文件內(nèi)容,去掉16和18行前面dnl字符,dnl注釋開始,我們要把這兩行的注釋符號(hào)去掉,17行不用管。wq保存文件。
config.m4文件其實(shí)有很多內(nèi)容,初始入門教程就不仔細(xì)說明各部分內(nèi)容,因?yàn)閷?shí)在我也不太懂!它的作用是配置擴(kuò)展的行為,比如說明擴(kuò)展編譯選項(xiàng),是否使用第三方庫(kù),擴(kuò)展的源碼組成等等。
四、編輯php_foobar.h文件:聲明一個(gè)函數(shù)
php_foobar.h是一個(gè)C頭文件,我們需要在這個(gè)頭文件里聲明一個(gè)方法
vim編輯php_foobar.h文件,找到下面這一行:
47 PHP_FUNCTION(confirm_foobar_compiled); /* For testing, remove later. */
這上ext_skel工具生成擴(kuò)展骨架的時(shí)候自動(dòng)聲明的一個(gè)函數(shù),僅用于測(cè)試,你可以去掉,也可以保留!在這一行的下面添加一行:
48 PHP_FUNCTION(halo);
這就聲明了一個(gè)名為halo的PHP空間的函數(shù),在PHP的代碼里就可以像普通函數(shù)一樣調(diào)用它。當(dāng)然,目前到這一步還不行,因?yàn)檫@里只是聲明,還沒有定義它的行為。我們將在foobar.c文件中編寫它的函數(shù)體。
四、編輯foobar.c文件:定義函數(shù)體
foobar.c是擴(kuò)展主要實(shí)現(xiàn)的地方,找到下面幾行:
41 const zend_function_entry foobar_functions[] = { 42 PHP_FE(confirm_foobar_compiled, NULL) /* For testing, remove later. */ 43 PHP_FE_END /* Must be the last line in foobar_functions[] */ 44 };
在42行下面添加PHP_FE(halo, NULL)。注意不要添加任何分號(hào)。如下:
41 const zend_function_entry foobar_functions[] = { 42 PHP_FE(confirm_foobar_compiled, NULL) /* For testing, remove later. */ 43 PHP_FE(halo, NULL) 44 PHP_FE_END /* Must be the last line in foobar_functions[] */ 45 };
這一步是向PHP空間注冊(cè)一個(gè)函數(shù),名字就是剛才在php_foobar.h文件聲明的halo。
接下來是真正編寫halo函數(shù)實(shí)現(xiàn)的時(shí)候。
在文件末尾添加以下代碼:
169 PHP_FUNCTION(halo){ 170 php_printf("hello world!"); 171 }
從代碼看出:halo函數(shù)只是打印一串字符串hello world,不做其他任何事情。
foobar.c文件內(nèi)容很多,每個(gè)代碼段都有相應(yīng)的注釋說明,仔細(xì)研究一下,應(yīng)該還是大概能懂是什么意思!如果看不明白也沒關(guān)系,還是媽媽那句話:等你長(zhǎng)大(看多)了就懂了
OK!編碼完畢,下面就是把擴(kuò)展編譯進(jìn)PHP,供PHP代碼調(diào)用!
五、編譯安裝擴(kuò)展
擴(kuò)展編譯分動(dòng)態(tài)編譯和靜態(tài)編譯兩種方法!今天我們先討論動(dòng)態(tài)編譯。有興趣的同學(xué)可以自行研究一下靜態(tài)編譯是什么鬼!
在擴(kuò)展目錄中執(zhí)行phpize命令。一定要在擴(kuò)展的目錄執(zhí)行才有效,否則將得到一個(gè)錯(cuò)誤提示。
如果提示沒有找到命令,請(qǐng)檢查系統(tǒng)沒有安裝php-dev工具集,如果是源碼編譯安裝的PHP,一般在php的bin目錄下面,如果通過yum或apt安裝的PHP請(qǐng)確認(rèn)是否安裝過php-dev或者php-devel,安裝過的話應(yīng)該直接就能運(yùn)行phpize命令。也可通過find / -name phpize命令來找到phpize的路徑,然后帶路徑執(zhí)行,如果系統(tǒng)安裝了多個(gè)版本的PHP,最好是指定路徑的phpize來指定使用的PHP版本!還找不到的話就GOOGLE一下吧!
phpize命令的正常輸出如下:
Configuring for: PHP Api Version: 20121113 Zend Module Api No: 20121212 Zend Extension Api No: 220121212
它表明的是當(dāng)前使用的PHP內(nèi)核的版本。
執(zhí)行完phpize命令,細(xì)心的你會(huì)發(fā)現(xiàn)擴(kuò)展目錄下多出了好多文件,我的意見是不用管這些文件是干嘛用的,當(dāng)然有興趣也可以研究一下!
下一步就是configure,詳細(xì)命令如下:
./configure --enable-foobar --with-config-path=/usr/local/php/bin/php-config
configure需要兩個(gè)選項(xiàng):--enable-foobar表示啟用這個(gè)擴(kuò)展; --with-config-path=/usr/local/php/bin/php-config, 指定了php-config的路徑,一般源碼編譯安裝的PHP和多版本環(huán)境都需要指定這個(gè)選項(xiàng),apt和yum安裝的都是在默認(rèn)路徑,可以不特別指定。
configure之后又多了好多文件,再一次無視它們吧!命令輸出好長(zhǎng)的一陀?xùn)|西。
configure完之后就是make了。
什么?command not found?先安裝gcc和make吧! 方法請(qǐng)Google!
順利make完之后,會(huì)在擴(kuò)展的目錄下的modules子目錄多了一個(gè)foobar.so的文件,
它就是我們剛才編寫的擴(kuò)展的最終產(chǎn)物。聰明的你一定已經(jīng)想到:這TM不就是個(gè)動(dòng)態(tài)庫(kù)嗎?而我只能說:你說對(duì)了!動(dòng)態(tài)編譯產(chǎn)生的是動(dòng)態(tài)庫(kù)文件。
OK,擴(kuò)展編譯完了,需要在PHP中使用擴(kuò)展,復(fù)制foobar.so的完整路徑,vim打開PHP的配置文件php.ini,在文件的末尾加入以下內(nèi)容:
extension=/root/php-5.5.38/ext/foobar/modules/foobar.so #這是在我的系統(tǒng)foobar.so路徑
保存退出,重啟一下php-fpm(或apache,nginx什么的,如果不確定,就都重啟吧!請(qǐng)不要在生產(chǎn)環(huán)境瞎搞)
有些人就忍不住要問一下了:為什么有些擴(kuò)展在php.ini的配置中不用帶路徑?其實(shí)我們的擴(kuò)展一樣也是可以的。在make命令之后多執(zhí)行一步:make install,如果不是root權(quán)限,請(qǐng)自覺加sudo或切到root用戶下執(zhí)行。擴(kuò)展就會(huì)安裝到相應(yīng)PHP版本的默認(rèn)擴(kuò)展加載路徑!然后在php.ini的配置中就只要簡(jiǎn)單寫上擴(kuò)展名加so即可.
extension=foobar.so
至此,一個(gè)簡(jiǎn)單的PHP擴(kuò)展就完成了。是不是有點(diǎn)小激動(dòng)?
下面驗(yàn)證一番,在WEB目錄新建一個(gè)php文件,如info.php,寫入如下代碼:
地球人都知道這個(gè)函數(shù)調(diào)用是做什么的吧?
在瀏覽器執(zhí)行這個(gè)文件!看到以下輸出就說明擴(kuò)展安裝成功了:
直接修改info.php文件吧,調(diào)用我們剛才在擴(kuò)展中定義的函數(shù):
刷新瀏覽器,如果人品不太壞的話應(yīng)該就能看到以下的輸出:
hello world!BingGo!
如果你覺得這文章不錯(cuò),請(qǐng)給我點(diǎn)個(gè)贊吧^_^!六、擴(kuò)展閱讀
PHP擴(kuò)展開發(fā)及內(nèi)核應(yīng)用
TIPI項(xiàng)目
longmon@github
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22293.html
摘要:教你三分鐘快速制作應(yīng)用開發(fā)功能正式對(duì)外開放了,很多小伙伴們已經(jīng)躍躍欲試,想嘗試著去制作自己的應(yīng)用,這里我教大家快速制作應(yīng)用的方法,那就是通過復(fù)制應(yīng)用功能,三分鐘就能制作出來一個(gè)可安裝運(yùn)行的應(yīng)用。 教你三分鐘快速制作URLOS應(yīng)用 URLOS開發(fā)功能正式對(duì)外開放了,很多小伙伴們已經(jīng)躍躍欲試,想嘗試著去制作自己的應(yīng)用,這里我教大家快速制作應(yīng)用的方法,那就是通過復(fù)制應(yīng)用功能,三分鐘就能制作出...
摘要:編程書籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來給大家后續(xù)的文章和總結(jié)會(huì)繼續(xù)分享,先分享一部分的 編程書籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
閱讀 3187·2021-11-23 09:51
閱讀 1524·2021-11-22 09:34
閱讀 2836·2021-10-27 14:15
閱讀 2265·2021-10-12 10:17
閱讀 1884·2021-10-12 10:12
閱讀 946·2021-09-27 14:00
閱讀 1996·2021-09-22 15:19
閱讀 1032·2019-08-30 10:51