在Windows上编译PHP拓展
- 来自于 Benoit Blanchon 20 January 2015
- 译者 7gugu
- 原文章链接 https://blog.benoitblanchon.fr/build-php-extension-on-windows/
我最近尝试编写了一个PHP拓展,虽然说文档上有很详细的介绍如何在Linux上进行编译操作,但是关于在Windows平台上编译的信息少之又少。
所以这篇文章就是给大家介绍一下,如何使用Visual Studio构建一个PHP拓展。
环境要求
这篇指南是假设在你已经编写了链接所示的一个输出"Hello World"的PHP拓展。 here并且你已经在Linux上成功编译了。
在Windows上构建你的PHP拓展前,你需要完成以下的操作。
- Visual Studio (这里是一个坑点,请确认你的VS的编译器的版本跟PHP编译时的版本是一样的。比如说官网的7.1.33是用的VC14【VS2015】编译的,那么你的拓展也要是用VC14编译的,否则是不能安装你编译好的拓展的。如果你用的是VS2017+,但你有用的是旧版本的PHP环境写的拓展,那么你就要手动编译PHP才能使用你编写的拓展了)
- PHP源代码 (未编译的PHP代码)
在之后的文章中,我将会按一下列表假设:
- PHP源码是位于
C:\php-src
- 你编写的"Hello World"拓展位于
C:\MyPhpExtensions\hello
在Windows上编译拓展跟Linux上有点相似
你应该已经很熟悉这个过程,但这里还是列出了一个步骤清单给你: (以下虽然是在Linux上构建编译时运行的代码,但是在Windows上其实是一样的,只是有一些指令的名字和运行方法有点不同而已)
- 安装
php-devel
包 - 运行
phpize
从config.m4
中生成configure
脚本 . - 运行
./configure --enable-hello
生成Makefile
- 运行
make
开始编译拓展
(以下是在Windows上编译时要改变的东西,按步骤执行就可以顺利生成拓展了)
使用 config.w32
替代 config.m4
在Windows平台上, 使用config.w32
代替config.m4
,但是格式上还是有点不同。
从 config.m4
迁移到 config.w32
是非常直接的, 你仅仅需要的是把Automake的代码转换成JavaScript语法的代码。
下面是一个简单的例子:
ARG_ENABLE("hello", "Hello World support", "no");
if (PHP_HELLO != "no") {
EXTENSION("hello", "php_hello.c", true);
}
不要忘记把EXTENSION
的第三参数设置成true
, 这么设定就会选择生成动态编译库(DLL)而不是静态编译到PHP代码中。
如果你想知道更多关于*.32的语法信息,你可以看看别的文件夹的*.w32文件。
使用 buildconf.bat
代替 phpize
在Windows平台上,你将会使用 buildconf.bat
代替 phpize
。
打开VS的"适用于 VS 20XX 的 x86/64 本机工具命令提示”命令行工具并且运行以下代码
cd C:\php-src
buildconf.bat --add-modules-dir=C:\MyPhpExtensions
buildconf.bat
将会自动扫描 C:\MyPhpExtensions
文件夹下所有的 config.w32
文件。
随后将会生成一个 configure.bat
的脚本文件.
使用 configure.bat
代替 ./configure
在Linux上,configure
就仅仅是用来编译拓展用的,但是在Windows平台上configure.bat
是用来编译PHP代码为exe文件的。
你需要在运行 configure.bat
时添加以下命令行选项以生成最少数量的内容,从而确保不必解决对外部库的依赖性
cd C:\php-src
configure.bat --disable-all --enable-cli --enable-hello
--disable-all
就是禁止生成其他内容,省略了输入 --disable-xxx
和 --without-xxx
的必要 , --enable-cli
是启用php命令行界面 (ie php.exe
) , --enable-hello
是启用编译你的拓展"Hello"
系统默认会按照TS(线程安全)模式进行编译,如果你需要NTS(线程非安全)模式进行编译,你仅仅需要加上这一条 --disable-zts
,就可以按照NTS模式进行编译。
使用 NMake
代替 Make
configure.bat
将会生成一个Windows版本的 Makefile
用作在Windows上 Make
.(编译代码)
开始编译代码,仅仅需要运行以下代码即可:
nmake
这不仅仅会编译你自己的拓展,同时也会将 php.exe
编译出来。 这对于开发者来说,是一个很方便的做法,因为你需要一个相同编译环境生成出来的 php.exe
,那样子才能正确安装你的PHP拓展。
实际上,为了加载到php中,您的扩展必须与php构建相匹配,条件是:
- 系统位数 (32 or 64 位)
- 线程是否安全 (TS 模式 或者 NTS 模式)
- 编译器的版本 (VS9, VS11 之类的.)
如果你确实不需要编译出 php.exe
, 那么你仅仅需要按以下代码运行即可:
nmake php_hello.dll
消除警告(Warnings)
在编译PHP拓展的过程中,编译器常常会报一堆警告:
如果你想禁用这些警告,你可以在 c:\php-src\win32\build\config.w32
中,加入以下的代码段:
ADD_FLAG('CFLAGS', ' /wd4005 /wd4267 /wd4244 ');
ADD_FLAG('CFLAGS_BD_ZEND', ' /wd4018 /wd4101 /wd4090 /wd4273 ');
ADD_FLAG('CFLAGS_BD_MAIN', ' /wd4018 /wd4090 ');
ADD_FLAG('CFLAGS_BD_MAIN_STREAMS', ' /wd4013 ');
DEFINE('RC', '$(RC) /nologo /d _USING_V110_SDK71_');
并且,在 C:\php-src\ext\standard\config.w32
中加入这行代码:
ADD_FLAG('CFLAGS_BD_EXT_STANDARD', ' /wd4047 /wd4018 ');
最后在 C:\php-src\sapi\cli\config.w32
中加入下列这一行代码:
ADD_FLAG('CFLAGS_BD_SAPI_CLI', ' /wd4018 ');
笔记: 一些能够帮助你开发PHP拓展的博文[英文生肉]
- Extension Writing Part I: Introduction to PHP and Zend
- Extension Writing Part II: Parameters, Arrays, and ZVALs
- [Extension Writing Part II: Parameters, Arrays, and ZVALs continued]
- Extension Writing Part III: Resources
- Wrapping C++ Classes in a PHP Extension
- PHP Extension Writing
- PHP Extensions Made Eldrich: Working with the API ÔÇô the PHP C API
- PHP Extensions Made Eldrich: Classes
- Build your own PHP on Windows
- PHP Internals Book
- Zend API: Hacking the Core of PHP