前言
有时候,我们要在windows系统安装一个定制的php扩展,或者PECL官网没有提供windows版编译好的DLL扩展文件,我们就需要自己从源码编译DLL扩展文件。
PHP扩展(Extension)的编译在linux系统编译比较容易一些,但是在windows系统步骤就比较多,本文根据官网文档,以编译php7.3下64位的apcu扩展为例,介绍编译PHP7扩展的步骤。
准备工作
为编译php7扩展,需要准备以下工具和源码:
- Visual Studio。如果要编译php7.0或者php7.1扩展,需要安装VS2015;如果需要编译php7.2+扩展需要安装VS2017。
- php-sdk-binary-tools。在GitHub下载,选2.20稳定版本。
- php稳定版源码。在这里我们选php7.3.23的源码。
- 扩展源文件。本文以APCU为例,下载5.1版本。
- 依赖文件。由于仅仅编译扩展一般不需要编译依赖,此处略过。
在这里要注意的是,如果想要DLL扩展能够复制到已经装好的PHP环境中使用,必须要保证扩展和PHP主运行文件
- 编译器一致(VS2015/VS2017)
- 位数一致(32位/64位)
- 是否线程安全一致(TS/NTS)
Windows系统下64位非线程安全是常用的版本,也是接下来本文要编译的目标。
组织目录
- 解压
php-sdk-binary-tools
,本文解压到G:\php-sdk
文件夹 - 打开cmd命令行窗口,执行以下命令以初始化相关环境变量,这里我们需要用vs2017生成64位的目标文件
G: cd php-sdk G:\php-sdk\phpsdk-vc15-x64.bat
- 创建的目录结构,这时候会在php-sdk文件夹下创建
phpdev\vc15\x64
文件夹,并进入相应文件夹phpsdk_buildtree phpdev
- 把php7.3源码解压到
phpdev\vc15\x64
文件夹下,把apcu源码解压到phpdev\vc15\x64\pecl
文件夹下。这时候php-sdk
目录结构如下所示│─bin ├─doc ├─lib ├─msys2 ├─pgo └─phpdev └─vc15 └─x64 ├─deps ├─pecl │ └─apcu └─php-7.3.23-src
编译扩展
- 执行以下命令生成配置文件configure.js
buildconf
- 执行以下命令编译php-cli和apcu扩展,
configure --disable-all --disable-zts --enable-cli --enable-apcu=shared
命令的含义是编译生成非线程安全(nts)版本的php-cli和php扩展动态库apcu,禁止编译其它模块和扩展,–disable-zts表示生成非线程安全版本的目标文件。要查看所有可能的命令参数,请执行
configure --help
- 最后执行编译命令
nmake
根据机器配置不同,大概等待3-5分钟,可以在
G:\php-sdk\phpdev\vc15\x64\php-7.3.23-src\x64\Release
看到生成的扩展文件php_apcu.dll
测试验证
把php_apcu文件复制到系统原有的php文件夹下的ext文件夹,并在php.ini启用扩展,执行php -m,可以看到apcu扩展已经启用