在windows下編譯php擴展
在你開始之前
在Windows上構建PHP前需要做三件事
- 正確設置的構建環境,包括編譯器和PHP SDK
- 預編譯的庫和PHP依賴的第三方庫
- PHP源碼
編譯器
要求
PHP支持使用Microsoft的Visual C ++編譯器進行構建。不支持MinGW和Cygwin。
ICC和clang可以用於實驗目的。但是請注意,只有使用Visual C ++才能保證生產質量的二進制文件。
完全支持免費使用的Community VC ++版本,並且可以使用它們。
有關更多信息以及如何獲取編譯器,請參閱受支持的版本。支持以下VC ++版本:
- Visual C++ 14.0 (Visual Studio 2015) for PHP 7.0 or PHP 7.1.
- Visual C++ 15.0 (Visual Studio 2017) for PHP 7.2, PHP 7.3 or PHP 7.4.
- Visual C++ 16.0 (Visual Studio 2019) for master.
支持特定的Visual Studio版本意味着僅支持其默認平臺工具集。使用非默認平臺工具集(例如Visual Studio 2019中的14.16)構建PHP可能有效,但不建議這樣做。
Visual C文件名(和PHP_SDK_VS環境變量;請參見下文)中,通常縮寫爲Visual Studio版本。
在Visual Studio 2019之前,縮寫使用方案“ vc#”(例如“ vc14”)。該數字(“#”)是各個平臺工具集的主要數字。
Visual Studio 2017的預覽版本隨平臺工具集15.00一起提供,因此使用了“ vc15”。
但是,Visual Studio 2017的第一個GA版本附帶了平臺工具集14.10(以表示向後兼容性),但內部Visual Studio版本號保持爲15.00。
爲了避免混淆,保留了“ vc15”。對於Visual Studio 2019內部版本(主版本),“ vc#”最終已更改爲“ vs#”(請注意“ s”),該數字現在指定主要的內部Visual Studio版本號。
設置
-
從Github獲取最新的穩定SDK版本
- 在構建PHP 7.2+時,需要新的PHP SDK
- 閱讀Github頁面上的PHP SDK特定說明。
-
如果編譯PHP 7.0+:
- 安裝Visual Studio 2015
-
如果編譯PHP 7.2+:
- 安裝Visual Studio 2017
-
如果是master:
- 安裝Visual Studio 2019
-
可選工具
- Git
- Cppcheck
- Clang
命令提示符
PHP SDK 2.0.0+提供了啓動腳本,這些腳本可以自動設置編譯器環境。入門腳本還提供了注入定製設置的功能。要創建自定義的安裝腳本,請將您的代碼放入phpsdk-local.bat PHP SDK根目錄中的文件中。以下變量在PHP SDK Shell中自動可用
- PHP_SDK_ARCH-用於環境設置的目標構建體系結構
- PHP_SDK_ OS _ARCH -操作系統架構
- PHP_SDK_PHP_CMD-集成的PHP二進制包裝器腳本
- PHP_SDK_ROOT_PATH-PHP SDK根目錄的路徑
- PHP_SDK_VS-用於該環境的Visual C ++版本(在PHP SDK 2.2.0beta4之前,此變量名爲PHP_SDK_VC)
- 還有其他一些不相關的變量,可以通過以下set命令查看PHP SDK附帶的工具的完整列表可以在存儲庫自述頁面上找到。
每個版本的Visual Studio(或Windows SDK)都提供了一個用於編譯的命令提示符環境(可從“開始”菜單啓動)。例如,如果您要省略啓動腳本用法或要測試Visual Studio的預發行版本,則可以使用它。
- 如果編譯PHP 7.0+,請打開“ VS2015 x64本機工具命令提示符”或“ VS2015 x86本機工具命令提示符”。
本文檔其餘部分中的所有命令都應在相應的命令提示符下運行。
下載要求
- 獲取PHP源代碼,有兩種選擇:
- 獲取二進制工具:
- 可從github獲得
- 或者以zip格式獲取標籤,或者克隆git存儲庫並簽出標籤
- 獲取PHP依賴的庫:
- 使用PHP SDK工具通過調用自動獲取合適的依賴項 phpsdk_deps -u或者,從下載打包的deps,選擇匹配的VC ++版本和體系結構目錄。請注意,不再爲PHP 7.2及更高版本提供.7z軟件包。
注意:這應該包括構建大多數核心擴展所需的庫。但是,某些其他擴展可能需要其他庫,頭文件和幫助程序。請參閱libs,獲取所需的版本,然後將存檔解壓縮到deps目錄中(請參見下文)。PECL擴展目錄下提供了另一組用於PECL擴展構建的庫。如果需要,它們需要手動獲取。
- 使用PHP SDK工具通過調用自動獲取合適的依賴項 phpsdk_deps -u或者,從下載打包的deps,選擇匹配的VC ++版本和體系結構目錄。請注意,不再爲PHP 7.2及更高版本提供.7z軟件包。
設置構建目錄
在構建PHP之前,該操作只能執行一次。此處使用的參考二進制SDK目錄爲c:\php-sdk,可以根據具體情況使用任意位置。因此,我們將該路徑C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src用作PHP 7.1.0的Visual C ++ 64位版本的參考路徑。
- 設置PHP SDK
- 創建構建目錄 c:\php-sdk 解壓二進制工具歸檔到這個目錄,它應包含三個子目錄: bin, lib and msys2
- 打開命令提示符並輸入構建目錄:
cd c:\php-sdk
- 運行啓動程序腳本(例如,對於Visual Studio 2015 64位版本),運行phpsdk-vc14-x64.bat
- 運行phpsdk_buildtree批處理腳本,將會創建構建所需的目錄結構:
phpsdk_buildtree phpdev
- 該phpsdk_buildtree腳本將根據當前使用的VC ++版本創建路徑,並切換到新創建的目錄
- 將PHP源代碼提取到,其中:C:\php-sdk\phpdev\vX##\x##
- vX##是您使用的編譯器版本(eq vc14或vs16)
- x##是您的架構(x86或x64)
- 例如: C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src
- 在提取PHP源代碼的同一目錄中,有一個deps目錄。請執行以下任一操作
- 切換到php源目錄並運行 phpsdk_deps -u
- 如果您在上一步中手動下載了依賴項,請將其解壓縮到deps中
編譯
請注意,PHP SDK腳本當前不支持任何交叉構建。
- 運行啓動程序腳本自動爲所需的構建配置設置好環境
c:\php-sdk\phpsdk-vc14-x64.bat
- 將目錄切換到您的PHP源代碼的位置,例如
cd C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src
- 運行
buildconf
- 查看編譯幫助概述:
configure --help
- 創建您的configure :
configure --disable-all --enable-cli --enable-$remains
- 編譯php 運行
nmake
- 如果要把PHP構建和擴展打包到壓縮包中,請在’nmake’之後運行:
nmake snap
- 編譯後的PHP現在位於“C:\php-sdk\phpdev\vX##\x##\php-source-directory\Release_TS”下。如果您運行“ nmake snap”,則zip文件也將位於此處。如果使用“ –disable-zts”進行編譯,則已編譯的PHP將位於“C:\php-sdk\phpdev\vX##\x##\php-source-directory\Release”下。可以通過configure --enable-object-out-dir 參數可以設置編譯php的位置。
更改後重新編譯
- 清理舊的已編譯二進制文件
nmake clean
- 如果您需要更新“配置”腳本
buildconf --force
- 創建您的makefile:請參見發佈
configure --disable-all --enable-cli --enable-$remains
- 編譯
nmake
構建PECL擴展
許多PECL擴展已經具有預構建的DLL,可以從PECL網站上的擴展頁面下載這些DLL。例如,在APCu擴展頁面上,發行檔案鏈接旁邊有* DLL *鏈接。他們將您帶到一個頁面,您可以在其中下載所需的PHP版本和體系結構的已編譯擴展。
要構建PECL擴展(例如APCu):
- 在PECL(APCu)上打開擴展的頁面
- 通過以下方式下載擴展源:
- 下載源檔案
- 從擴展程序的存儲庫中獲取源代碼(可以在瀏覽源代碼下找到鏈接
- 創建一個pecl與您的PHP源目錄相同級別的目錄,例如C:\php-sdk\phpdev\vc14\x64\pecl
- 將擴展源代碼提取或克隆到pecl目錄
- 如果克隆,則克隆到子目錄,例如 C:\phpsdk\phpdev\vc14\x64\pecl\apcu
源代碼檔案應該已經包含一個名爲例如的子目錄 apcu-4.0.7 - 調用啓動程序腳本以自動爲所需的構建配置fe設置環境c\php-sdk\phpsdk-vc14-x64.bat
- 如果克隆,則克隆到子目錄,例如 C:\phpsdk\phpdev\vc14\x64\pecl\apcu
- 輸入您的PHP源目錄
- 通過運行以下命令來重建配置腳本:
buildconf
- configure –help現在執行應包含啓用APCu的選項
--enable-apcu Whether to enable APCu support
- 配置和構建:
configure --disable-all --enable-cli --enable-apcu
nmake
- 使用php -m命令測試二進制文件,以確保已加載APCu。此時,已編譯的擴展名將位於發行目錄中。
陷阱
對於可能的PHP SDK問題,請查閱PHP SDK自述文件
從PHP 7.3開始,可以使用–enable-native-intrinsics開關。
然後,生成的二進制文件將需要具有相應功能集的處理器。
例如,如果設置–enable-native-intrinsics =avx2,請確保目標計算機具有支持AVX2的處理器。
教程至此結束,下面是我的安裝過程。
下載php源碼
環境準備
執行下面命令
phpsdk-vc15-x64.bat
output
[vcvarsall.bat] Environment initialized for: 'x64'
PHP SDK 2.2.1-dev
OS architecture: 64-bit
Build architecture: 64-bit
Visual C++: 14.23.28106.4
PHP-SDK path: C:\Users\xxx\Downloads\PHP2Compile\php-sdk-binary-tools-master
在php-sdk-binary-tools 會生成出phpdev、phpdev\vs16\x64。把下載好的php源碼放在些目錄中。
vc##
是您正在使用的編譯器版本(eq vc15)x##
是你的構建的系統位數(x86 或 x64)
運行下面命令,php 會自動下載 需要的依賴包 (php7 以前需要手動下載 php-dsp 文件)
phpsdk_deps -u
output
Configuration: 7.3-vc15-x64-stable
Processing package ICU-64.2-vc15-x64.zip
Processing package apache-2.4.28-vc15-x64.zip
Processing package c-client-2007f-vc15-x64.zip
...
開始編譯
切換到php源碼目錄
buildconf
output
Rebuilding configure.js
Now run 'configure --help'
編譯php
configure --disable-all --enable-cli
output
PHP Version: 7.3.11
Saving configure options to config.nice.bat
Checking for cl.exe ... <in default path>
WARNING: Using unknown MSVC version 19.23.28106.4
....
....
| Build type | Release |
| Thread Safety | Yes |
| Compiler | MSVC 19.23.28106.4, untested |
| Architecture | x64 |
| Optimization | PGO disabled |
| Native intrinsics | SSE2 |
## | Static analyzer | disabled |
Type 'nmake' to build PHP
執行完這一步會在main目錄下生成config.w32.h文件,編譯php擴展會用到這個文件。
運行
nmake
執行這下步會有些慢先去喝口水,休息下。
編譯好的php在 php-sdk-binary-tools-master\phpdev\vs16\x64\php-7.3.11-src\x64\Release_TS 目錄
運行
php -i
能執行說明成功了
編譯擴展
下載擴展 arraylist
buildconf
configure --disable-all --enable-cli --enable-yaf=shared
nmake
–enable-cli-xxx=shared 表示動態鏈接庫,會生成單獨的dll文件。否則會編譯到php中。
這就編譯完了