windows下编写、编译php扩展

php 编程技术
发布日期 2023-07-17 更新日期 2024-11-05 阅读次数 158 文章字数 2.1k

在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 许可协议。

php

发表评论

相关推荐
朱丰华   |   7个月前   |   php

php判断是否被iframe

221    评论    点赞
朱丰华   |   1年前   |   php

php正则表达式定界符:异常Delimiter must not be alphanumeric or backslash

190    评论    点赞
朱丰华   |   1年前   |   php · 缓存 · opcache

php 加速、提高并发opcache

198    评论    点赞
朱丰华   |   1年前   |   正则 · 表达

正则表达式,实现if...then...else

113    评论    点赞
朱丰华   |   1年前   |   sql · php

PHP如何使用PDO批量执行SQL?

114    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 字符串

如何在 PHP 中将字符串的第一个字母转换为大写

148    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 正则

php正则表达式原生字符

85    评论    点赞
朱丰华   |   1年前   |   字符 · php · 比较

PHP比较字符串大小相关函数

110    评论    点赞
朱丰华   |   1年前   |   linux · php

linux下编写、编译php扩展

150    评论    点赞
朱丰华   |   1年前   |   php · 混淆 · obfuscate · git

yakpro-po混淆php代码

105    评论    点赞
朱丰华   |   1年前   |   php

php扩展编译nts的方法

85    评论    点赞
朱丰华   |   1年前   |   linux · 变量 · 环境

linux查看环境变量、设置环境变量

94    评论    点赞
朱丰华   |   1年前   |   js · php · 字符 · 字符串

php json_encode对字符串转义用法

135    评论    点赞
朱丰华   |   1年前   |   php · 捕获

php Fatal error怎么捕获

126    评论    点赞
朱丰华   |   1年前   |   php · 编译

ubuntu、centos系统从源码编译指定版本php--超详细

158    评论    点赞
朱丰华   |   1年前   |   php · git · 编译

从源码编译php

135    评论    点赞
朱丰华   |   1年前   |   php · zend · 反射 · api

php zend引擎api接口:ZENDAPI阅读,反射调用示例

123    评论    点赞
朱丰华   |   1年前   |   php · 引用 · 变量 · c语言

php扩展内存管理与引用计数

127    评论    点赞
朱丰华   |   1年前   |   zend · php · 类型 · zval

php内核zval类型,与基本类型的转换

115    评论    点赞
朱丰华   |   1年前   |   php · zend · 调用 · 文件

php扩展开发,调用php函数

99    评论    点赞
{{item.author_name}}   |   {{new Date(item.date*1000).log()}}   |   {{it}} ·

{{item.title}}

{{item.uv}}    评论    点赞