2018-02-02 配置Windows下開(kāi)發(fā)PHP擴(kuò)展

寫(xiě)在前頭

這個(gè)配置是基于windows的IIS部署php的情況下饭入,開(kāi)發(fā)php的擴(kuò)展,編譯出dll文件,供應(yīng)php中代碼可用function五芝。
通過(guò)2天在baidu來(lái)回折騰,終于自己摸索出了工作方案辕万,記錄備忘枢步,也可以被其他程序員參考 沉删。
baidu上的內(nèi)容,實(shí)在太模糊了醉途,寫(xiě)到重點(diǎn)都沒(méi)有矾瑰。

關(guān)鍵要素

  • 服務(wù)器OS:windows,開(kāi)發(fā)機(jī)是windows10
  • http服務(wù):IIS
  • php版本:VC14編譯php7.1.*隘擎,x64殴穴,nts
  • vs2015的開(kāi)發(fā)IDE

環(huán)境是什么,決定了用什么方式進(jìn)行開(kāi)發(fā)货葬,所以必須要想明白自己的環(huán)境狀態(tài)推正。因?yàn)榫幾g的擴(kuò)展需要和編譯的php主程序匹配,否則擴(kuò)展是不能使用的宝惰。

要素 說(shuō)明
php版本 7.1.7 從微軟的iis express上下載的植榕,參考微軟的start sql server by php on windows
編譯器 VC14 使用vs2015 c++編譯器
線程安全 no 非線程安全,匹配IIS上fast cgi的php版本都是NTS的編譯的php
編譯環(huán)境 X64 在64位環(huán)境中編譯的可執(zhí)行程序

環(huán)境準(zhǔn)備

安裝cygwin

下載地址:https://cygwin.com/install.html;
可以考慮在安裝之后加載bison尼夺,因?yàn)閜hp的編譯過(guò)程可以使用尊残。不安裝也可以,php上下載的編譯工具中自帶淤堵。

安裝vs2015 c++的開(kāi)發(fā)IDE

實(shí)際不需要IDE寝衫,但是考慮到微軟的東西,還是打包下載的比較保險(xiǎn)拐邪。
vs2015中必須有C++的編譯器即可慰毅。其他都不用。
我測(cè)試使用vs2017扎阶,但是編譯后出問(wèn)題汹胃,還是倒回vs2015,編譯后可以使用东臀。

部署php的sdk

下載地址:http://windows.php.net/downloads/php-sdk/
我使用了:deps-7.1-vc14-x64着饥,php編譯的依賴包。
還需要使用:php-sdk-binary-tools-20110915惰赋,注意是老版本了宰掉,沒(méi)有具體的新版本,實(shí)際也可以用赁濒。

部署php的源代碼

下載地址:http://windows.php.net/downloads/releases/
我使用了:php-7.1.2-src轨奄,雖然運(yùn)行的php是7.1.7,但是實(shí)際測(cè)試拒炎,源碼的版本只要小版本一致即可挪拟。根據(jù)php.net的說(shuō)法,使用高版本的php源碼是沒(méi)有問(wèn)題的枝冀。還沒(méi)有時(shí)間做測(cè)試舞丛。

維護(hù)工作目錄

  1. 解壓php-sdk-binary-tools-20110915耘子,形成一個(gè)tools目錄
  2. 解壓php源碼果漾,形成php7.1src目錄
  3. 自建dev目錄球切,屆時(shí)可以存放擴(kuò)展的代碼

配置OS的PATH

  1. 配置php的運(yùn)行目錄,這樣可以cmd中執(zhí)行php.exe
  2. 配置tools目錄
  3. 配置源碼目錄绒障,因?yàn)榫幾g過(guò)程需要使用源碼內(nèi)的一些bat

工作步驟

復(fù)制必要的文件到工作目錄

  1. 使用VS2015的cmd工具
    我的運(yùn)行環(huán)境是php的x64nts吨凑,因此選擇x64的cmd工具。在cmd中進(jìn)入tools目錄(解壓php-sdk-binary-tools-20110915)
  2. 執(zhí)行tools的環(huán)境預(yù)設(shè)
cd bin
phpsdk_setvars.bat
phpsdk_buildtree.bat extdev

extdev是一個(gè)工作目錄户辱,這個(gè)可以自己定義鸵钝,我這里就用這個(gè)。執(zhí)行后庐镐,會(huì)在tools的并排目錄里創(chuàng)建好extdev目錄恩商,內(nèi)含多個(gè)vc**的目錄。
由于工具是2011年的必逆,因此沒(méi)有VC14怠堪,需要自己維護(hù)一個(gè)VC14,再創(chuàng)建一個(gè)x64目錄名眉。雖然應(yīng)該也配套建設(shè)x86粟矿,但是我的運(yùn)行php的x64的,因此x86就不必了损拢。
另外extdev的目錄工具只是產(chǎn)生一套規(guī)范目錄陌粹,與開(kāi)發(fā)其實(shí)沒(méi)有硬關(guān)系「Q梗可以cd..后做掏秩,也可以不用做。

  1. 創(chuàng)建deps環(huán)境
    將deps-7.1-vc14-x64的壓縮包內(nèi)容荆姆,添加到x64下哗讥。
    實(shí)際操作感覺(jué),也無(wú)所謂工作目錄那么嚴(yán)謹(jǐn)也一樣可以編譯php擴(kuò)展胞枕。但是嚴(yán)謹(jǐn)?shù)墓ぷ髂夸浭莻€(gè)好習(xí)慣杆煞。

  2. 復(fù)制源碼
    將源碼包解壓到x64中,形成php714-src的目錄腐泻。

最終形成了我的工作環(huán)境目錄:

D:
 | -- work
       | -- php_sdk_tool                     // 解壓php-sdk-binary-tools-20110915
       | -- extdev                           // 運(yùn)行phpsdk_buildtree.bat extdev之后得到 
              | -- vc14                      // 自建
                     | -- x64                // 自建 
                            | -- deps        // 解壓deps-7.1-vc14-x64
                            | -- php714-src  // 解壓php714的源碼决乎,編譯需要的configure.js等都在這里,這個(gè)是執(zhí)行編譯命令的目錄
                                   | -- ext  // php標(biāo)準(zhǔn)擴(kuò)展目錄
                                         | -- myext // 執(zhí)行php ext_skel_win32.php --extname=myext之后php創(chuàng)建派桩,自開(kāi)發(fā)擴(kuò)展源碼就在這里构诚,.32配置文件在這里
                                   | -- x64  // 64位編譯結(jié)果輸出
                                          | -- Release // 編譯非線程安全的輸出,這里可以找到編譯結(jié)果php_myext.dll铆惑,如果編譯發(fā)生LKN范嘱,php7.lib復(fù)制到這里重新編譯
                                          | -- Release_TS // 編譯線程安全的輸出送膳,結(jié)果dll在這里
                                   | -- Release // 32位擴(kuò)展的編譯輸出,應(yīng)該是非線程安全丑蛤,我沒(méi)有測(cè)試過(guò)叠聋,邏輯推測(cè)

生成程序模板

到php714-src中,cd到ext目錄受裹,找到對(duì)應(yīng)的win32的開(kāi)發(fā)配置php程序碌补,修改cygwin的bin路徑。(在windows開(kāi)發(fā)就是這樣麻煩棉饶,linux中應(yīng)該不用吧厦章?)

cd..
cd php714-src
cd ext
vim ext_skel_win32.php
//$cygwin_path設(shè)置為你當(dāng)前cygwin安裝目錄的bin目錄。
php ext_skel_win32.php --extname=%your extension name% // eg : myext

這個(gè)操作完成后照藻,會(huì)在ext的目錄下袜啃,出現(xiàn)%your extension name% (myext)的文件夾。就是php工具創(chuàng)建的擴(kuò)展空模板幸缕。修改代碼群发,再編譯,就可以完成擴(kuò)展的開(kāi)發(fā)冀值。

cd %your extension name% // eg : myext

進(jìn)入自己的擴(kuò)展目錄也物,其中有2個(gè)配置文件需要修改(參考php ext_skel_win32.php 執(zhí)行后的說(shuō)明也可以明白)。
一個(gè)是linux系統(tǒng)中需要的*.m4的配置列疗,一個(gè)是windows系統(tǒng)的.w32文件配置滑蚯。
我們這里修改.w32的文件。將一下被注釋的代碼復(fù)原:

ARG_ENABLE("myext", "enable myext support", "no");

編譯程序配置

然后回到源碼目錄抵栈,執(zhí)行配置程序的創(chuàng)建工作告材。

cd..
buildconf --force
configure --help

通常操作第一步后,如果成功古劲,會(huì)提示你操作第二步斥赋。
這個(gè)時(shí)候,系統(tǒng)會(huì)提示有configure.js的某行代碼出錯(cuò)产艾,直接vim去修改這行代碼疤剑,一般是末尾的注釋需要修正:

ARG_ENABLE("myext", "enable myext support", "no"); */ -- 就是這個(gè)地方

然后再次執(zhí)行configure --help∶票ぃ可以查看配置的功能清單隘膘。重點(diǎn)關(guān)注自己的myext是否存在,還有諸如zts功能(線程安全與否的開(kāi)關(guān))杠览。

執(zhí)行擴(kuò)展編譯

在cmd中繼續(xù)執(zhí)行命令

configure --disable-all --enable-cli --disable-zts --enable-myext=shared
//                ^ 關(guān)閉其他功能                 ^ 編譯非線程安全
nmake

如果要編譯線程安全的弯菊,則不需要--disable-zts
根據(jù)提示應(yīng)該繼續(xù)執(zhí)行nmake。

期間可能會(huì)出現(xiàn)若干錯(cuò)誤踱阿,一般都是環(huán)境配置的問(wèn)題:

  1. 使用vs2015 x64的命令行可以減少諸如cl.exe管钳、link.exe的問(wèn)題
  2. 編譯器報(bào)告lnk的問(wèn)題钦铁,基本都是php7.lib的文件不到位的問(wèn)題〔牌幔可以從php的運(yùn)行系統(tǒng)中牛曹,在php的目錄dev中找到這個(gè)文件,復(fù)制到編譯工作目錄:php714\src\x64\release\
  3. 正常情況下栽烂,編譯完成后躏仇,會(huì)在源碼目錄中出現(xiàn)對(duì)應(yīng)的輸出目錄:release(對(duì)應(yīng)x86的編譯)和x64(對(duì)應(yīng)x64的編譯)恋脚。而x64又出現(xiàn)Release_TS和Release目錄腺办,分別對(duì)應(yīng)線程安全和非線程安全。

測(cè)試使用

將編譯后的輸出糟描,本次是php714\src\x64\release\中的php_myext.dll復(fù)制到php的運(yùn)行環(huán)境怀喉,并配置ini。
在cmd中執(zhí)行php代碼船响,就可以查看到extension是否成功加載躬拢。如果加載有問(wèn)題,會(huì)馬上有警告见间。

  1. 警告模塊不是擴(kuò)展模塊:可能編譯器不正確聊闯,比如php714使用VC14,而編譯擴(kuò)展使用了不匹配的
  2. 警告不是有效的win32米诉,則運(yùn)行php的位數(shù)和擴(kuò)展編譯的位數(shù)不匹配菱蔬,即運(yùn)行php的版本和擴(kuò)展編譯的版本應(yīng)該都是對(duì)應(yīng)x86或x64
  3. 警告找不到模塊:可能是運(yùn)行的php的線程安全與編譯的線程安全開(kāi)關(guān)不匹配。

測(cè)試方式:

php -r "phpinfo();"
php -r "echo confirm_myext_compiled(0);"

為了方便查看史侣,在phpinfo制作一個(gè)php文件通過(guò)http訪問(wèn)也可以看到擴(kuò)展myext的加載拴泌。

注意事項(xiàng)

從baidu上其他的使用vs2015引入擴(kuò)展目錄創(chuàng)建工程,我沒(méi)有操作成功惊橱。多半都是編譯環(huán)境的問(wèn)題蚪腐,我發(fā)現(xiàn)百度的內(nèi)容基本都是php5的,php7很少税朴。估計(jì)php7升級(jí)到這個(gè)版本后回季,擴(kuò)展的開(kāi)發(fā)有了變化,因此我怎么也沒(méi)有成功正林。(實(shí)際是成功編譯了dll泡一,但是php不認(rèn)這個(gè)dll)。不過(guò)使用vs2015開(kāi)一個(gè)工程卓囚,對(duì)于開(kāi)發(fā)調(diào)試還是很有幫助的瘾杭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哪亿,隨后出現(xiàn)的幾起案子粥烁,更是在濱河造成了極大的恐慌贤笆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨阻,死亡現(xiàn)場(chǎng)離奇詭異芥永,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钝吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)埋涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奇瘦,你說(shuō)我怎么就攤上這事棘催。” “怎么了耳标?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵醇坝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我次坡,道長(zhǎng)呼猪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任砸琅,我火速辦了婚禮宋距,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘症脂。我一直安慰自己谚赎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布摊腋。 她就那樣靜靜地躺著沸版,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兴蒸。 梳的紋絲不亂的頭發(fā)上视粮,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音橙凳,去河邊找鬼蕾殴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岛啸,可吹牛的內(nèi)容都是我干的钓觉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坚踩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起批幌,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤础锐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后荧缘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體皆警,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年截粗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了信姓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绸罗,死狀恐怖意推,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情从诲,我是刑警寧澤左痢,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布靡羡,位于F島的核電站系洛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏略步。R本人自食惡果不足惜描扯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趟薄。 院中可真熱鬧绽诚,春花似錦、人聲如沸杭煎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羡铲。三九已至蜂桶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間也切,已是汗流浹背扑媚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雷恃,地道東北人疆股。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像倒槐,于是被迫代替她去往敵國(guó)和親旬痹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • PHP安裝redis擴(kuò)展 以下操作需要在下載的 phpredis 目錄中完成: 如果你是 PHP7 版本,則需要下...
    手表大大閱讀 1,469評(píng)論 0 1
  • 0.前言 在之前一段時(shí)間涉及PHP擴(kuò)展開(kāi)發(fā)两残,對(duì)PHP源代碼有調(diào)試需求羡忘,然而網(wǎng)上大部分都是在LINUX下調(diào)試的教程,...
    lambdacalculus閱讀 4,460評(píng)論 1 5
  • 當(dāng)行李箱放上托運(yùn)帶,當(dāng)?shù)菣C(jī)牌拿在手上票从,當(dāng)空乘站在機(jī)門(mén)歡迎你的時(shí)候智哀,扣緊安全帶,飛機(jī)在跑道上加速射沟,直到飛上云霄套蒂,嗡嗡...
    黃木卜閱讀 1,169評(píng)論 4 8
  • 鑒于近日群里有一些小伙伴對(duì)于flex布局不是很清楚,我決定總結(jié)flex的相關(guān)知識(shí)點(diǎn)吟榴,希望能加深大家的印象魁蒜,同時(shí)也是...
    宋大腫閱讀 6,032評(píng)論 5 9