windows下编写、编译php扩展
在windows下编译,要使用专用sdk,否则会缺少依赖,php-sdk项目由microsoft维护,已停止更新,还可以下载。
根据版本要求描述说明,编译php72以上的,就要使用sdk2.2版本
The toolset consists on a mix of the hand written scripts, selected MSYS2 parts and standalone programs. It supports any workflows, be it a custom, local or a CI build whatsoever.
The PHP SDK 2.2+ is compatible with PHP 7.2 and above.
The PHP SDK 2.1 is required to build PHP 7.1 or 7.0.
The legacy binary tools SDK is available from the legacy branch and is suitable to build PHP 5.
php-sdk下载地址:https://github.com/microsoft/php-sdk-binary-tools/archive/refs/tags/php-sdk-2.2.0.zip
接着下载widows版本的php【一般使用nts】,以及源码,windows.php.net - /downloads/releases/archives/
先解压windows版本的php,作为编译环境,而源码包的ext目录下才有ext_skel.php脚本
使用php.ext配合ext_skel.php脚本,生成初始的扩展包【扩展名huazstar】
cd 源码包路径/ext
D://xxxxxxxxx/php.exe ext_skel.php --ext huazstar --author zhufenghua --std
此时,在ext路径下,多了一个huazstar目录,里面有默认的扩展包,代码不做介绍和修改,主要说编译。
在windows下,不能使用linux的方法【理论上可以,可以在php官网下载php dev https://windows.php.net/download/,(下载对应版本的Development package (SDK to develop PHP extensions),就有phpize,)但是实际上总缺少各种依赖包】,所以我们用前面说的由microsoft维护的php-sdk
该sdk使用的是visual c++编译的,它并不是标准的c++,在linux上能编译通过的它不一定可以,因为它不支持C99+语法等。并且我们需要visual c++环境,根据其描述,它在编译对应版本的php时,要使用对应版本的visual c++
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 or PHP 7.3.
Visual C++ 16.0 (Visual Studio 2019) for PHP 7.4.
所以我们要下载visual studio 2019,否则没有vs16环境
在安装visual studio 2019时,必须勾选C++的桌面开发
接下来,使用php-sdk开始编译,以php80为例子,它对应的是vs16,所以在解压的php-sdk包,找到phpsdk-vs16-x64.bat,在cmd环境中执行该bat文件,此时窗口由该bat代理。
在bat代理窗口时(注意前缀变成$),cd 到php源码目录,然后输入
buildconf
即可生成configure.js,接下来configure,一般情况下编译的扩展会和php混合在一起,我们需要的是单独的dll文件,这里=shared就是让huazstar扩展生成单独的dll
configure --disable-all --enable-cli --enable-huazstar=shared --disable-zts
另外需要注意,如果是zts(一般都是用zts),需要加上 –disable-zts
configure执行成功后,得到config.nice.bat文件,会提示nmake【文件编码如果是utf8无签名可能报错,改utf8带签名】
nmake
这时,在php源码中,会发现多了一个x64目录,再往里找Release目录【这里是zts,如果是ts则名为Release_TS目录】,会发现php和扩展同时编译成功了,根目录就可以看到php.exe和php_huazstar.dll文件,这个就是独立的扩展文件了,在php的ini配置文件中,追加
[huazstar]
extension=D:/xxx/php_huazstar.dll
重启php,测试php扩展,代码问题删除Release目录然后重复configure和nmake即可重新生成dll【文件占用时无法删除,但可以改名,每次生成后比如改名Release1】
<?php
$res = extension_loaded('huazstar'); //扩展名
var_dump($res); //bool(true)
echo "<br>";
echo test1(); // The extension huazstar is loaded and working!
echo "<br>";
echo test2(); //Hello World
可参考php官方文档:PHP: internals:windows:stepbystepbuild_sdk_2 (纯英文,不过基本一致)
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-461.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。