win10 编译php7.2 自定义简单的扩展
1、环境准备
1.1、Visual C++ 编译器(安装vs2019)
官方支持使用微软的Visual C++ compilers。
Visual C++ 15.0 (Visual Studio 2017) for PHP 7.2, PHP 7.3 or PHP 7.4.
安装宇宙第一IDE——visual studio 2019 社区版(免费)。
1.2、sdk-tool 下载
官方提供了工具,版本根据官方指定的,选择2.2
The PHP SDK 2.2+ is compatible with PHP 7.2 and above.
下载并切换到2.2 版本。
1
2git clone https://github.com/microsoft/php-sdk-binary-tools.git php-sdk
git checkout php-sdk-2.2.0
1.3、下载php7.2 源码1https://windows.php.net/downloads/releases/php-7.2.31-src.zip
1.4、php7.2
编译过程中用到了php 命令行,运行脚本。
1.5、git bash
2、编译前准备
2.1、利用sdk-tool 生成对应的开发目录
1、进入php-sdk 目录下
运行脚本phpsdk-vc15-x64.bat
输入phpsdk_buildtree phpdev ,会生成并进入目录php-sdk\phpdev\vc15\x64
vc15 指的是编译环境15,x64 系统位数是64
2、安装依赖包
运行phpsdk_deps -u或phpsdk_deps --update --branch master。这是官方给的做法,但是网速不行。
上面的命令会把依赖安装到php-sdk\phpdev\vc15\x64\deps 目录下,只需要把以来下载并解压到该目录下就可以了。
notice:依赖地址
选择 vc15—–>x64 路径下的所有的文件下载并解压到deps 下。
2.2、编写扩展
2.2.1、生成扩展结构
把php7.2 的源码解压到php-sdk\phpdev\vc15\x64 目录下。使用bash 进入到/php-sdk/phpdev/vc15/x64/php-7.2.31/ext 目录下
输入:
1php.exe ext_skel_win32.php --extname=mytestfunction
在当前目录下生成了文件夹mytestfunction
2.2.2、自定义函数
添加下面的代码到ext\mytestfunction\mytestfunction.c
1
2
3PHP_FUNCTION(mytestfunction) {
php_printf("This is my function PHP extension! \n");
}
并且修改
3、编译扩展
1、切回到cmd 命令界面。启动脚本进入到编译环境,进入php7.2 源码目录,运行buildconf
输入configure --help 报错。
修改php-sdk\phpdev\vc15\x64\php-7.2.31\configure.js
2、重新输入configure --help,命令参数出现在了help 的列表里
3、运行configure --disable-all --enable-cli --enable-mytestfunction=shared 命令,添加编译时的配置(添加扩展的配置参数)。
结果里出现了自定义的可用扩展
4、运行nmake 构建php
报错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18D:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31
$ nmake
Microsoft (R) 程序维护实用工具 14.26.28806.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
Recreating build dirs
type ext\pcre\php_pcre.def > D:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\php7ts.dll.def
"D:\Windows Kits\10\bin\10.0.18362.0\x64\mc.exe" -h win32\ -r D:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ -x D:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ win32\build\wsyslog.mc
MC: Compiling win32\build\wsyslog.mc
"cl.exe" /D COMPILE_DL_MYTESTFUNCTION /D MYTESTFUNCTION_EXPORTS=1 /nologo /I . /I main /I Zend /I TSRM /I ext /D _WINDOWS /D WINDOWS=1 /D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 /D _USE_MATH_DEFINES /FD /wd4996 /Zc:inline /Zc:__cplusplus /MP /LD /MD /W3 /Ox /D NDebug /D NDEBUG /D ZEND_WIN32_FORCE_INLINE /GF /D ZEND_DEBUG=0 /D ZTS=1 /I "D:\git-repository\php-sdk\phpdev\vc15\x64\deps\include" /D FD_SETSIZE=256 /FoD:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ext\mytestfunction\ /FpD:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ext\mytestfunction\ /FRD:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ext\mytestfunction\ /FdD:\git-repository\php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\ext\mytestfunction\ /c ext\mytestfunction\mytestfunction.c
mytestfunction.c
ext\mytestfunction\mytestfunction.c(57): warning C4101: “len”: 未引用的局部变量
ext\mytestfunction\mytestfunction.c(150): error C2065: “zif_mytestfunction”: 未声明的标识符
ext\mytestfunction\mytestfunction.c(150): error C2099: 初始值设定项不是常量
ext\mytestfunction\mytestfunction.c(150): warning C4047: “初始化”:“const _zend_internal_arg_info *”与“uint32_t”的 间接级别不同
NMAKE : fatal error U1077: “D:\MicrosoftVisualStudio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64\cl.exe”: 返回代码“0x2”
Stop.
5、解决
修改ext\mytestfunction\mytestfunction.c
把
1
2
3
4PHP_FUNCTION(mytestfunction)
{
php_printf("This is my function PHP extension! \n");
}
往上放一放,像图里这样
notice:重复 3 的操作(重新buildconf 等等)
configure 的错通过编辑php-sdk\phpdev\vc15\x64\php-7.2.31\ext\mytestfunction\config.w32 解决
6、解决完报错后,等好一会,php 构建成功
就在源码目录下——php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS
当前目录下执行.\php.exe -v 还会显示当前目录下的php 的版本信息
当前目录下没有php.ini 配置文件,从源码目录下复制php.ini-development 到当前目录并改名。
然后修改php.ini php-sdk\phpdev\vc15\x64\php-7.2.31\x64\Release_TS\php.ini
添加
添加
4、测试扩展
源码目录下新建test.php
1
2<?php
mytestfunction();
运行命令
1.\php.exe test.php
5、修改扩展
重新configure 和nmake