從源程式編譯

本章講述了在 Windows 下如何使用 Microsoft 的工具編譯 PHP。要在 CygWin 中編譯 PHP,請參考 Unix 系統下的安裝一章。

需求

要編譯 PHP 需要 Microsoft 開發環境。推薦使用 Microsoft Visuaul C++ 6.0,不過 .NET 版也可以用(無論是是免費的 Microsoft Visual C++ Toolkit 還是商業版的 Microsoft Visual C++ .NET)。要釋放下載的檔案還需要一個 ZIP 檔案的解壓縮工具。Windows XP 和更新的版本中已經內建了此功能。

在開始之前,需要先下載:

最後,還需要 PHP 本身的原始碼。可以通過匿名 CVS 得到最新的開發版本,一個快照或是最新發行版本的源程式的打包檔案。

放到一起

下載了所有的包後需要將它們解壓縮到適當的位置:

  • 建立一個工作目錄作為解壓縮後存放所有檔案的地方,例如:C:\work

  • 在工作目錄(C:\work)下新增一個目錄 win32build 並將 win32build.zip 解壓縮到其中。

  • 在工作目錄(C:\work)下新增一個目錄 bindlib_w32 並將 bindlib_w32.zip 解壓縮到其中。

  • 將下載的 PHP 源程式解壓縮到工作目錄(C:\work)中。

  • 要編譯庫還需要(或下載現成的)標頭檔和庫檔案並分別放置到 C:\work\win32build\includeC:\work\win32build\lib 目錄中去。

經由以上步驟後目錄結構應該如下:
+--C:\work
|  |
|  +--bindlib_w32
|  |  |
|  |  +--arpa
|  |  |
|  |  +--conf
|  |  |
|  |  +--...
|  |
|  +--php-5.x.x
|  |  |
|  |  +--build
|  |  |
|  |  +--...
|  |  |
|  |  +--win32
|  |  |
|  |  +--...
|  |
|  +--win32build
|  |  |
|  |  +--bin
|  |  |
|  |  +--include
|  |  |
|  |  +--lib

若果不是用 Cygwin 的話,還必須新增一個目錄 c:\usr\local\lib 並將 bison.simplec:\work\win32build\bin 複製到 c:\usr\local\lib 中。

注: 若果想使用 PEAR 以及舒適的指令行安裝程式,就非要用 CLI-SAPI。有關 PEAR 和安裝程式的更多訊息見 PEAR 網站。

編譯 resolv.lib

必須編譯 resolv.lib 庫。自己決定是需要除錯訊息(bindlib - Win32 Debug)還是不需要(bindlib - Win32 Release),但是要記住自己的選取,因為必須用同樣的模式編譯 PHP,否則會出連線錯誤。編譯適當的配置:

  • 圖形介面會員,通過滑鼠按兩下 C:\work\bindlib_w32\bindlib.dsw 運行 VC++。接著選取 Build => Rebuild All。

  • 指令行會員,確認要麼註冊了 C++ 環境變量,要麼運行了 vcvars.bat,然後運行下面任意一行指令:

    • msdev bindlib.dsp /MAKE "bindlib - Win32 Debug"

    • msdev bindlib.dsp /MAKE "bindlib - Win32 Release"

到這一步,應該得到了一個可用的 resolv.libc:\work\bindlib_w32\Debug 或是 Release 目錄下。將此檔案複製到 c:\work\win32build\lib 目錄下並覆蓋同名的檔案。

用新編譯系統編譯 PHP(僅適用於 PHP >=5)

本節講解了怎樣用新編譯系統編譯 PHP >=5,此系統是基於 CLI 的,並且非常類似於 PHP 的 Unix 編譯系統。

注: 此編譯系統在 PHP 4 中不可用。請參考用 DSW 檔案編譯 PHP一節。

開始之前要確保閱讀了放到一起一節並且已經編譯了所有所需的庫,例如 LibxmlICU(PHP >= 6 中需要)。

首先應該開啟一個用於 Visual Studio 的指令行提示符,應在開始選單中能找到。標準的指令提示符可能不能用,因為沒有設定所需的環境變量。輸入類似 cd C:\work\php-5.x.x 的指令進入 PHP 源程式目錄。現在可以開始配置 PHP 了。

第二步是運行 buildconf 批處理檔案來掃瞄資料夾尋找 config.w32 來建立配置腳本。預設時此指令還會搜尋以下目錄:pecl; ..\pecl; pecl\rpc; ..\pecl\rpc。自 PHP 5.1.0 起,可以通過 --add-modules-dir 參數來改變此行為(例如 cscript /nologo win32/build/buildconf.js --add-modules-dir=../php-gtk2 --add-modules-dir=../pecl)。

第三步是配置。要檢視可用的配置選項清單,輸入 cscript /nologo configure.js --help 指令。選取了需要啟動或禁止的選項之後,輸入類似 cscript /nologo configure.js --disable-foo --enable-fun-ext 的指令。使用 --enable-foo=shared 將嘗試將「foo」增加庫編譯為共享的,可動態加載的模組。

最後一步是編譯。只需運行指令 nmake 即可。所建立的檔案(例如 .exe 和 .dll)將會放在 Release_TSDebug_TS 目錄下(若果編譯的是執行緒安全版的話),或是是 ReleaseDebug 目錄。

作為可選項還可以運行 PHP 的測試套件,輸入 nmake test 指令。若果要做一個特定的測試,可以用 'TESTS' 變量(例如 nmake /D TESTS=ext/sqlite/tests test 將只執行 sqlite 測試)。要移除編譯過程中建立的檔案,可以用 nmake clean 指令。

有個很有用的選項來編譯快照:--enable-snapshot-build。此選項增加了一個新的編譯模式(nmake build-snap)。這將嘗試編譯每一個可用的增加庫(預設為共享模組模式),但是忽略個別的增加庫或 SAPI 中的編譯錯誤。

用 DSW 檔案編譯 PHP(PHP 4)

自 PHP 5 起不支援用 DSW 檔案來編譯 PHP,因為有了一個更靈活的系統。不過還是可以用此方法,但要記住此系統並不經常維護,因此編譯可能會有問題。不過這是在 Windows 下編譯 PHP 4 的唯一方法。

配置 MVC ++

第一步是配置 MVC++ 來準備編譯。啟動 Microsoft Visual C++,在選單中選取 Tools => Options。在對話框中選取 directories 標籤。按順序把下拉選項選為 Executables,Includes 和 Library files。其內容應類似於:

  • Executable files:C:\work\win32build\bin,Cygwin 會員:C:\cygwin\bin

  • Include files:C:\work\win32build\include

  • Library files:C:\work\win32build\lib

編譯

對於初學者最好的上手方法是編譯 CGI 版本:

  • 圖形介面會員,運行 VC++,選取 File => Open Workspace 選單並選取 C:\work\php-4.x.x\win32\php4ts.dsw。接著選取 Build => Set Active Configuration 選單並選取想要的配置,要麼是 php4ts - Win32 Debug_TS 要麼是 php4ts - Win32 Release_TS。最後選取 Build => Rebuild All。

  • 指令行會員,確認要麼註冊了 C++ 環境變量,要麼運行了 vcvars.bat,然後從 C:\work\php-4.x.x\win32 目錄下運行下面任意一行指令:

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS"

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS"

    • 到這一步,應該得到一個可用的 php.exeC:\work\php-4.x.x.\Debug_TSRelease_TS 目錄下。

有可能通過編輯 main/config.win32.h 檔案對編譯做少量的定制。例如可以改變 php.ini 檔案的預設位置,內建的增加庫,以及增加庫的預設位置。

下一步可能想要編譯 CLI 版本,這是設計用於 PHP 的指令行模式。步驟和編譯 CGI 版本相同,只除了要選取 php4ts_cli - Win32 Debug_TS 或是 php4ts_cli - Win32 Release_TS 項目檔案。成功編譯後會在 Release_TS\cli\ 或是 Debug_TS\cli\ 目錄下找到 php.exe 檔案。

要編譯 SAPI 模組(php4isapi.dll)來將 PHP 和 Microsoft IIS 整合起來,將 active configuration 設為 php4isapi-whatever-config 並編譯所需要的 dll。.