星期三, 7月 28, 2010

在 Windows 編譯PHP原始碼 (VC++9)

我們需要安裝下面編譯器 和 類別庫 用來編譯PHP,這篇文章則以PHP5.3.1為編譯範例 :

  1. Microsoft Visual Studio C++ 2008 Express Edition x86
  2. Windows SDK 6.1
  3. PHP 編譯用工具
  4. PHP 延伸模組編譯用開發套件(選擇性)
第1,2項,只要下一步的預設安裝即可。(重要:如果是編譯 apache SAPI請用 VC++6 x86 和 Thread Safe 模式)
第3,4項的部分,我們建立一個開發用的目錄夾 c:\php-sdk 並且將 binary-tools.zip 解開到這個目錄匣內,延伸模組用的開發套件也是解壓縮後放到這個目錄夾上來。如果都有抓回並解開的話,那麼c:\php-sdk 底下會有四個目錄匣:

  • bin        (工具執行檔,動態連結檔)
  • script    (系統環境變數批次檔)
  • include (標頭檔)
  • lib         (靜態連結檔)
下載 PHP 5.3.1 原始碼:php-5.3.1.tar.gz
最新的 PHP 版本原始碼下載:下載

將原始碼解開後,放至 C:\ 底下,會建立一個 c:\php-5.3.1 原始檔目錄。

我是用繁體中文的系統和繁體中文的VC9編譯,其實出現了一個小麻煩,像是其中的 ext\standard\browscap.c 裡面寫著特殊字元,所以編譯時,編譯器無法辨識,造成語法出錯。這個錯誤已經有人回報給 PHP 官方 BUG#50112 ,大致原因是編譯環境使用頁碼為 950 的緣故,故我們在安裝完所有的工具之後,需到控制台=>地區即語言選擇=>系統管理=>非unicode程式的語言 將這裡切換成英文(美國),接著重新開機即可。(或是下指令 mode con:cp select=437)

以上軟體一切就緒,就可以開始編譯。

開啟 Visual Studio 2008 命令提示字元 (進入 dosbox)

這時候 dosbox 視窗資訊會顯示:
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
C:\Program Files\Microsoft Visual Studio 9.0\VC>

切換到 C:\php-5.3.1 原始碼路徑內,並執行 php-sdk 的環境變數設定批次檔:


C:\Program Files\Microsoft Visual Studio 9.0\VC>cd c:\php-5.3.1
c:\php-5.3.1>c:\php-sdk\bin\phpsdk_setvars.bat
c:\php-5.3.1>set INCLUDE=%INCLUDE%;C:\php-sdk\include
c:\php-5.3.1>set LIB=%LIB%;C:\php-sdk\lib

接著重新建立編譯用的環境設定批次檔:
c:\php-5.3.1>buildconf.bat
執行完畢後,他會顯示下面訊息:
Rebuilding configure.js
Now run 'configure --help'

上面訊息是指產生了編譯用的環境設定批次檔(搜尋置於ext目錄下要編譯的PHP延伸模組),並且可用 --help 參數 查看有哪些編譯參數。

我們編譯有兩種,一種是Thread Safe 模式,另一種則是Non Thread Safe模式。

Thread Safe 模式:
c:\php-5.3.1>configure.bat --enable-snapshot-build

Non - Thread Safe模式
c:\php-5.3.1>configure.bat --enable-snapshot-build --disable-zts


執行後,會檢測要編譯的PHP延伸模組的相關的標頭檔和連結檔。當一執行完畢後,他會顯示類似下列資訊 :





Enabled extensions: ----------------------- | Extension | Mode | ----------------------- | bcmath | static | | calendar | static | | com_dotnet | static | | ctype | static | | date | static | | ereg | static | | exif | shared | | filter | static | | ftp | static | | hash | static | | iconv | shared | | json | static | | mbstring | shared | | mysql | shared | | mysqli | shared | | mysqlnd | static | | odbc | static | | pcre | static | | pdo | static | | pdo_mysql | shared | | pdo_odbc | shared | | pdo_sqlite | shared | | phar | static | | reflection | static | | session | static | | shmop | shared | | sockets | shared | | spl | static | | sqlite | shared | | sqlite3 | shared | | standard | static | | tokenizer | static | ----------------------- Enabled SAPI: ------------- | Sapi Name | ------------- | cgi | | cli | | cli_win32 | | embed | | isapi | ------------- ------------------------------------------- | | | ------------------------------------------- | Build type | Release | | Thread Safety | Yes | | Compiler | MSVC9 (Visual C++ 2008) | | Architecture | x86 | ------------------------------------------- Type 'nmake snap' to build a PHP snapshot

當初現此訊息後,執行 nmake 編譯 PHP 原始碼了。
c:\php-5.3.1>nmake snap
之後會產生相關的.dll和.exe 在 Release_TS ( Thread Safe) 和 Release (Non-Thread safe) 目錄下。

至於若要額外編譯PECL或Extension的話,只要把原始碼放至在 c:\php-5.3.1\ext 目錄下,以及連結檔放至於 c:\php-sdk\lib 還有標頭檔 c:\php-sdk\include 下,重新執行上面的 buildconf.bat 重新建立,並且執行 configure.bat 有找到相關的檔案,這樣就會將延伸模組編譯在 Release_TS ( Thread Safe) 和 Release (Non-Thread safe) 目錄下了。

9 則留言:

  1. 您好
    請教 3.PHP 編譯用工具, 4.PHP 延伸模組編譯用開發套件(選擇性)這兩個工具要到何處下載? 因為連結已失效, 我想要編譯 php_pdo_firebird 這個模組
    謝謝

    回覆刪除
  2. 您好
    我主要是要編譯 php_pdo_firebird 這個模組成為 dll 供 window下 php 使用, 謝謝

    回覆刪除
  3. 這裡看看..
    http://windows.php.net/downloads/php-sdk/

    回覆刪除
  4. 看見了, 謝謝

    回覆刪除
  5. 您好
    請教出現這樣的情況是哪裡遺漏了, 敬請指導一下, 感謝

    C:\php-sdk\bin\php533dev\vc9\x86\php-5.3.3>nmake snap

    Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
    Copyright (C) Microsoft Corporation. All rights reserved.

    "" -h win32\ -r Release_TS\ -x Release_TS\ win32\build\wsyslog.mc
    '-h' 不是內部或外部命令、
    可執行的程式或批次檔。
    NMAKE : fatal error U1077: '"' : 傳回碼 '0x1'
    Stop.

    回覆刪除
  6. 原來是我的 Windows SDK 是6.0 所以不行, 改為6.1 就不會出現這問題了

    回覆刪除
  7. 您好
    再請教一下, 如何設定參數才能產生 pdo_firebird.dll 檔, 因為我下參數 --enable-pdo --with-pdo-firebird 呈現的模式是 static 好像就直接建立在 php5ts.dll 內,而不是獨立產生 pdo_firebird.dll , 再麻煩指導一下, 感謝

    回覆刪除
  8. 這樣呢?我記得好像是 --with-pdo-firebird=shared

    回覆刪除
  9. 有了, 真是非常感謝您

    回覆刪除

我的意見