在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中。
这就编译完了