PHP Extension開發(fā)實(shí)例

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ù)處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽哥,一起剝皮案震驚了整個(gè)濱河市钠乏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌春塌,老刑警劉巖晓避,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簇捍,死亡現(xiàn)場離奇詭異,居然都是意外死亡俏拱,警方通過查閱死者的電腦和手機(jī)暑塑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅必,“玉大人事格,你說我怎么就攤上這事「阋” “怎么了驹愚?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劣纲。 經(jīng)常有香客問我逢捺,道長,這世上最難降的妖魔是什么癞季? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任劫瞳,我火速辦了婚禮,結(jié)果婚禮上余佛,老公的妹妹穿的比我還像新娘柠新。我一直安慰自己,他們只是感情好辉巡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布恨憎。 她就那樣靜靜地躺著,像睡著了一般郊楣。 火紅的嫁衣襯著肌膚如雪憔恳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天净蚤,我揣著相機(jī)與錄音钥组,去河邊找鬼。 笑死今瀑,一個(gè)胖子當(dāng)著我的面吹牛程梦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橘荠,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼屿附,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哥童?” 一聲冷哼從身側(cè)響起挺份,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贮懈,沒想到半個(gè)月后匀泊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體优训,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年各聘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揣非。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伦吠,死狀恐怖妆兑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毛仪,我是刑警寧澤搁嗓,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站箱靴,受9級特大地震影響腺逛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衡怀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一棍矛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抛杨,春花似錦够委、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屈嗤,卻和暖如春潘拨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饶号。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工铁追, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茫船。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓琅束,卻偏偏與公主長得像,于是被迫代替她去往敵國和親算谈。 傳聞我的和親對象是個(gè)殘疾皇子涩禀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容