PHP Extension的開發(fā)基礎(chǔ)
PHP是當(dāng)前應(yīng)用非常廣泛的一門語言榜晦,從國外的Facebook冠蒋、Twitter到國內(nèi)的淘寶、騰訊乾胶、百度再到互聯(lián)網(wǎng)上林林總總的各種大中 小型網(wǎng)站都能見到它的身影抖剿。PHP的成功,應(yīng)該說很大程度上依賴于其開放的擴(kuò)展API機(jī)制和豐富的擴(kuò)展組件(PHP Extension)识窿,正是這些擴(kuò)展組件使得PHP從各種數(shù)據(jù)庫操作到XML斩郎、JSON、加密喻频、文件處理孽拷、圖形處理、Socket等領(lǐng)域無所不能半抱。有時(shí)候 開發(fā)人員可能需要開發(fā)自己的PHP擴(kuò)展,當(dāng)前PHP5的擴(kuò)展機(jī)制是基于Zend API的膜宋,Zend API提供了豐富的接口和宏定義窿侈,加上一些實(shí)用工具,使得PHP擴(kuò)展開發(fā)起來難度并不算特別大秋茫。本文將介紹關(guān)于PHP擴(kuò)展組件開發(fā)的基本知識史简,并通過一個(gè) 實(shí)例展示開發(fā)PHP擴(kuò)展的基本過程。
PHP擴(kuò)展組件的開發(fā)過程在Unix和Windows環(huán)境下有所不同肛著,但基本是互通的圆兵,本文將基于Unix環(huán)境(具體使用Linux)。閱 讀本文需要簡單了解Unix環(huán)境枢贿、PHP和C語言的一些基礎(chǔ)知識殉农,只要簡單了解就行,我會盡量不涉及太過具體的操作系統(tǒng)和語言特性局荚,并在必要的地方加以解 釋超凳,以便讀者閱讀愈污。
第一步要下載PHP源代碼,因?yàn)槔锩嬗虚_發(fā)擴(kuò)展需要的工具
解壓后轮傍,在源代碼目錄中有個(gè)ext目錄暂雹,這里便是和PHP擴(kuò)展有關(guān)的目錄。進(jìn)入目錄后用ls查看创夜,可以看到許多已經(jīng)存在的擴(kuò)展杭跪,其中可以看到我們很熟悉的mysql、iconv和gd等等驰吓。而ext_skel是Unix環(huán)境下用于自動生成PHP擴(kuò)展框架的腳本工具涧尿,后面我們馬上會用到,ext_skel_win32.php是windows下對應(yīng)的腳本棚瘟。
ext_skel的完整命令為:
ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir]?[--full-xml]?[--no-help]
里面有三個(gè)文件你必須注意:config.m4:這是Unix環(huán)境下的Build System配置文件现斋,后面將會通過它生成配置和安裝。
php_say_hello.h:這個(gè)文件是擴(kuò)展模塊的頭文件偎蘸。遵循C語言一貫的作風(fēng)庄蹋,這個(gè)里面可以放置一些自定義的結(jié)構(gòu)體、全局變量等等迷雪。
say_hello.c:這個(gè)就是擴(kuò)展模塊的主程序文件了限书,最終的擴(kuò)展模塊各個(gè)函數(shù)入口都在這里。當(dāng)然章咧,你可以將所有程序代碼都塞到這里面倦西,也可以遵循模塊化思想,將各個(gè)功能模塊放到不同文件中赁严。
下面的內(nèi)容主要圍繞這三個(gè)文件展開扰柠。
開發(fā)PHP擴(kuò)展組件的第一步不是寫實(shí)現(xiàn)代碼,而是要先配置好Build System選項(xiàng)疼约。由于我們是在Linux下開發(fā)卤档,所以這里的配置主要與config.m4有關(guān)。
開發(fā)PHP擴(kuò)展組件的第一步不是寫實(shí)現(xiàn)代碼程剥,而是要先配置好Build System選項(xiàng)劝枣。由于我們是在Linux下開發(fā),所以這里的配置主要與config.m4有關(guān)织鲸。
關(guān)于Build System配置這一塊舔腾,要是寫起來能寫一大堆,而且與Unix系統(tǒng)很多東西相關(guān)搂擦,就算我有興趣寫估計(jì)大家也沒興趣看稳诚,所以這里我們從略,只揀關(guān)鍵地方說 一下瀑踢,關(guān)于config.m4更多細(xì)節(jié)可以http://www.php.net/manual/en/internals2.buildsys.configunix.php">http://www.php.net/manual/en/internals2.buildsys.configunix.php" style="outline: none; text-decoration: none; color: rgb(61, 129, 238); border-bottom-width: 1px; border-bottom-style: dashed;">參考這里
編寫phpinfo()回調(diào)函數(shù)
因?yàn)閟ay_hello擴(kuò)展在各個(gè)生命周期階段并不需要做操作采桃,所以我們只編寫info_func的內(nèi)容懒熙,上文說過,這個(gè)函數(shù)將在phpinfo()執(zhí)行時(shí)被自動調(diào)用普办,用于顯示擴(kuò)展的信息工扎。編寫這個(gè)函數(shù)會用到四個(gè)函數(shù):
php_info_print_table_start()——開始phpinfo表格。無參數(shù)衔蹲。
php_info_print_table_header()——輸出表格頭肢娘。第一個(gè)參數(shù)是整形,指明頭的列數(shù)舆驶,然后后面的參數(shù)是與列數(shù)等量的(char*)類型參數(shù)用于指定顯示的文字橱健。
php_info_print_table_row()——輸出表格內(nèi)容。第一個(gè)參數(shù)是整形沙廉,指明這一行的列數(shù)拘荡,然后后面的參數(shù)是與列數(shù)等量的(char*)類型參數(shù)用于指定顯示的文字。
php_info_print_table_end()——結(jié)束phpinfo表格撬陵。無參數(shù)珊皿。
下面是“say_hello.c”中需要編寫的info_func的具體代碼:
1.下載PHP源碼包,進(jìn)入ext目錄
2.執(zhí)行./ ext_skel.sh=test 會生成框架目錄
3.進(jìn)入框架目錄巨税,修改相關(guān)的配置蟋定,會有一個(gè)test.c修改需要定義的目錄。進(jìn)行修復(fù)草添,配置文件也需要進(jìn)行修改驶兜,把源碼包中的解析需要關(guān)聯(lián)的功能加進(jìn)去,然后進(jìn)行操作
4.編譯之前需要運(yùn)行/usr/local/bin/phpize 远寸,運(yùn)行編譯模塊抄淑。
5../configure --with-php-config ?= /usr/local/php/etc/php-config
6.make && make install 編譯安裝,安裝完成以后驰后,會提示編譯的目錄蝇狼。
7.,打開php.ini文件倡怎,修改添加的編譯模塊,test.so模塊贱枣,把模塊名加進(jìn)去extension =test.so
8.重新php服務(wù)器 /usr/local/php5.3/php-fpm reload
9.編寫phpinfo();查看規(guī)則监署,繼續(xù)處理。