PHP的C/C++擴展(一)

因為個性化推薦系統(tǒng)的開發(fā),是架構(gòu)組與策略組的跨小團隊合作吭从,所以策略方不愿意公開自己的代碼绣版,所以就只能采用我們提供系統(tǒng)功能,對方提供策略部分.so文件來實現(xiàn)(策略團隊以C/C++作為主要語言)沥阳。

一、ext_skel 腳本

PHP 擴展由幾個文件組成自点,這些文件對所有擴展來說都是通用的桐罕。不同擴展之間,這些文件的很多細節(jié)是相似的桂敛,只是要費力去復(fù)制每個文件的內(nèi)容功炮。幸運的是,有腳本可以做所有的初始化工作埠啃,名為 ext_skel死宣,自 PHP 4.0 起與其一起分發(fā)。

不帶參數(shù)運行 ext_skel 在 PHP 5.6.24(最新正式版本) 中會產(chǎn)生以下輸出:

./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
           [--skel=dir] [--full-xml] [--no-help]

 --extname=module   module is the name of your extension
  --proto=file       file contains prototypes of functions to create
  --stubs=file       generate only function stubs in file
  --xml              generate xml documentation to be added to phpdoc-svn
  --skel=dir         path to the skeleton directory
  --full-xml         generate xml documentation for a self-contained extension
                     (not yet implemented)
  --no-help          don't try to be nice and create comments in the code
                     and helper functions to test if the module compiled

通常來說碴开,開發(fā)一個新擴展時毅该,僅需關(guān)注的參數(shù)是 --extname 和 --no-help博秫。除非已經(jīng)熟悉擴展的結(jié)構(gòu),不要想去使用 --no-help; 指定此參數(shù)會造成 ext_skel 在生成文件里省略很多有用的注釋眶掌。剩下的 --extname 會將擴展的名稱傳給 ext_skel挡育。"name" 是一個全為小寫字母的標(biāo)識符,僅包含字母和下劃線朴爬,在 PHP 發(fā)行包的 ext/ 文件夾下是唯一的即寒。*** 官網(wǎng)說了:其它參數(shù)不用明白,也不要嘗試召噩。 ***

執(zhí)行創(chuàng)建edutest1

 ? zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext  ./ext_skel --extname=edutest1
Creating directory edutest1
Creating basic files: config.m4 config.w32 .gitignore edutest1.c php_edutest1.h CREDITS EXPERIMENTAL tests/001.phpt edutest1.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/edutest1/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-edutest1
5.  $ make
6.  $ ./sapi/cli/php -f ext/edutest1/edutest1.php
7.  $ vi ext/edutest1/edutest1.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/edutest1/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.

二母赵、與 UNIX 構(gòu)建系統(tǒng)交互: config.m4

擴展的 config.m4 文件告訴 UNIX 構(gòu)建系統(tǒng)哪些擴展 configure 選項是支持的,你需要哪些擴展庫具滴,以及哪些源文件要編譯成它的一部分凹嘲。

autoconf 語法簡介

config.m4 文件使用 GNU autoconf 語法編寫。簡而言之构韵,就是用強大的宏語言增強的 shell 腳本周蹭。注釋用字符串 dnl 分隔,字符串則放在左右方括號中間(例如疲恢,[ 和 ])凶朗。字符串可按需要多次嵌套引用。

根據(jù)需要修改config.m4

  1. 切換到ext/edutest1/目錄显拳。
  2. vi config.m4
  3. 將下面的第一棚愤、三行取消注釋,并刪掉第二行:
16 dnl PHP_ARG_ENABLE(edutest1, whether to enable edutest1 support,
 17 dnl Make sure that the comment is aligned:
 18 dnl [  --enable-edutest1           Enable edutest1 support])
修改為:
16 PHP_ARG_ENABLE(edutest1, whether to enable edutest1 support,
 17     [  --enable-edutest1           Enable edutest1 support])
  1. PHP_SUBST一行的注釋打開:
19 if test "$PHP_EDUTEST1" != "no"; then
……
59   PHP_SUBST(EDUTEST1_SHARED_LIBADD)
60
61   PHP_NEW_EXTENSION(edutest1, edutest1.c, $ext_shared)
62 fi

簡要說明:

宏P(guān)HP_ARG_ENABLE萎攒,含有三個參數(shù):

第一個參數(shù)遇八,extest1./configure建立了名為enable-edutest1的選項
第二個參數(shù)將會在./configure命令處理到該擴展的配置文件時矛绘,顯示該參數(shù)的內(nèi)容
第三個參數(shù)是./configure命令的幫助耍休,在使用./configure --help的時候顯示

宏P(guān)HP_NEW_EXTENSION

該宏聲明了擴展的模塊和必須要編譯作為擴展一部分的源碼文件。如果需要多個源文件货矮,則使用空格分隔羊精,第三個參數(shù)$ext_shared與調(diào)用PHP_SUBST(EDUTEST1_SHARED_LIBADD)有關(guān)。

三囚玫、phpize喧锦、配置、編譯

因為我的Mac上已經(jīng)自帶了PHP的環(huán)境抓督,就不采取全套PHP源碼編譯的方法了燃少。使用命令行工具phpize對擴展進行編譯。

phpize 命令是用來準(zhǔn)備 PHP 擴展庫的編譯環(huán)境的工具铃在。如果系統(tǒng)中沒有 phpize 命令并且使用了預(yù)編譯的包(例如 RPM)阵具,那要安裝 PHP 包相應(yīng)的開發(fā)版本碍遍,此版本通常包含了 phpize 命令以及相應(yīng)的用于編譯 PHP 及其擴展庫的頭文件。使用 phpize --help 命令可以顯示此命令用法阳液。

使用root權(quán)限執(zhí)行phpize:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo /usr/bin/phpize
Password:
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212

configure怕敬,需要使用php-config工具:

php-config 是一個簡單的命令行腳本用于獲取所安裝的 PHP 配置的信息。在編譯擴展時帘皿,如果安裝有多個 PHP 版本东跪,可以在配置時用 --with-php-config 選項來指定使用哪一個版本編譯,該選項指定了相對應(yīng)的 php-config 腳本的路徑鹰溜。

 ? zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo ./configure --enable-edutest1 --with-php-config=/usr/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
……

Make 編譯:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo make
Password:
/bin/sh /Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/libtool --mode=compile cc  -I. -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1 -DPHP_ATOM_INC -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/include -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/main -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/edutest1.c -o edutest1.lo
mkdir .libs
……
……
……
Build complete.
Don't forget to run 'make test'.

Make Install:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo make install
Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20121212/

添加完整路徑到php.ini中:

 zhangxuefeng@zhangxuefengdeMac-mini sudo vim /etc/php.ini
……
899 extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/edutest1.so
……

四虽填、重啟HTTP服務(wù):

phpinfo截圖.png

成功!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曹动,一起剝皮案震驚了整個濱河市卤唉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仁期,老刑警劉巖桑驱,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跛蛋,居然都是意外死亡熬的,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門赊级,熙熙樓的掌柜王于貴愁眉苦臉地迎上來押框,“玉大人,你說我怎么就攤上這事理逊∠鹕。” “怎么了资厉?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵前计,是天一觀的道長。 經(jīng)常有香客問我汽久,道長羡洛,這世上最難降的妖魔是什么挂脑? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮欲侮,結(jié)果婚禮上崭闲,老公的妹妹穿的比我還像新娘。我一直安慰自己威蕉,他們只是感情好刁俭,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著韧涨,像睡著了一般牍戚。 火紅的嫁衣襯著肌膚如雪沙兰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天翘魄,我揣著相機與錄音鼎天,去河邊找鬼。 笑死暑竟,一個胖子當(dāng)著我的面吹牛斋射,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播但荤,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼罗岖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腹躁?” 一聲冷哼從身側(cè)響起桑包,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺非,沒想到半個月后哑了,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡烧颖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年弱左,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕淮。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡拆火,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涂圆,到底是詐尸還是另有隱情们镜,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布润歉,位于F島的核電站模狭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卡辰。R本人自食惡果不足惜胞皱,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一邪意、第九天 我趴在偏房一處隱蔽的房頂上張望九妈。 院中可真熱鬧,春花似錦雾鬼、人聲如沸萌朱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晶疼。三九已至酒贬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翠霍,已是汗流浹背锭吨。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寒匙,地道東北人零如。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像锄弱,于是被迫代替她去往敵國和親考蕾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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