在vs2017下编译php7.2.x扩展
工具 vs2017只需要安装VC++环境即可,大概占用空间8G,不要随便减少组件,否则有可能编译不过;
下载php-sdk最新版2.2.6,下载源码php7.2.20
php-7.2.20-src.zip
和二进制php-7.2.20-nts-Win32-VC15-x64.zip
,二进制是在zephir中使用的,下载desp,里面的vc15/x64/全部文件
,用命令非常慢,全部下载下来;安装zephir,用来,开发php扩展,原生c语言太难了,zephir开发很容易;配置环境变量
下载https://github.com/phalcon/zephir放到D:\php-sdk\zephir
,然后执行composer update
更新;
下载https://github.com/phalcon/php-zephir-parser/releasesphp-zephir-parser扩展,选择正确的版本,我选择zephir_parser_x64_vc15_php7.2-nts_1.3.1-481.zip
,配置到D:\php-sdk\php
里面ext目录,在php.ini里面加入即可D:\php-sdk\php //php二进制文件路径 D:\php-sdk\zephir\bin //zephir开发环境路径 D:\php-sdk\zephir\vendor\bin
解压phpsdk到
D:\php-sdk
;运行phpsdk-vc15-x64.bat
,变成$;phpsdk\_buildtree phpdev
,生成phpdev/vc15/x64
目录,在phpdev/vc15/x64
目录下新建php-src文件夹,将PHP源码复制到此目录, 切换到php-src目录(cd php-src),cd D:\php-sdk\phpdev\vc15\x64\php-src
执行
phpsdk\_deps -u
来更新deps,这个很慢用直接下载了放到x64/deps/下面;然后建立x64/pecl
目录,我们开发的所有扩展放到此处编译;编译命令buildconf configure --disable-zts --enable-cli --enable-zlib --enable-hash --enable-session --without-gd --with-bz2 --enable-demo=shared --enable-fd-setsize=2048 --enable-sanitizer nmake
然后就编译成功了;
在D:\php-sdk\phpdev\vc15\x64\php-src\x64\Release
可以找到你要的扩展php_扩展.dll,这是NTS版本D:\php-sdk\phpdev\vc15\x64\php-src\x64\Release_TS
下面是线程安全TS版本,编译用--disable-all
生成扩展
php_扩展.dll
,在php.ini添加extension=扩展名
,重启php即可;生成php7的dll模板
进入D:\php-sdk\phpdev\vc15\x64\php-src\ext
文件夹
执行PHP ext_skel_win32.php --extname=demo
生成模块文件夹demo
在demo.c中查找PHP_FUNCTION函数下添加PHP_FUNCTION(demo) { php_printf("Hello C extension中国"); }
修改
const zend_function_entry demo_functions[] = { PHP_FE(confirm_demo_compiled, NULL) PHP_FE(demo, NULL) //这里加一行代码 PHP_FE_END };
在D:\php-sdk\phpdev\vc15\x64\php-src\main\文件夹里的config.w32.h加
#define PHP_COMPILER_ID "VC15"
打开vs2017新建-从现有代码创建-项目名称demo
选择动态链接库,然后切换一下解决方案为release,x64
右键配置属性C/C++,附加包含目录D:\php-sdk\phpdev\vc15\x64\php-src D:\php-sdk\phpdev\vc15\x64\php-src\TSRM D:\php-sdk\phpdev\vc15\x64\php-src\main D:\php-sdk\phpdev\vc15\x64\php-src\Zend
C/C++预处理器
ZEND_DEBUG=0 PHP_EXTENSION PHP_WIN32 ZEND_WIN32 HAVE_EXT_CPP=1 COMPILE_DL_EXT_CPP ZEND_WIN32_KEEP_INLINE ZTS #不添加就是关闭安全,一般不加
\win32\build\文件夹里找到“config.w32.h.in”,将这个文件复制到E:\php7\main\文件夹里,去掉后面的“.in”
右键项目属性,连接器,输入,附加依赖项,编辑,将php7.lib的路径放进去(这个文件在php编译后的程序文件夹里,根目录的dev文件夹里路径D:\php-sdk\php\dev\php7.lib
编译生成的是NTS版本
在x64\Release\下面有ext_cpp.dll
需要改名字php_ext_cpp.dll,所有模块在前面加上php_然后在php.ini配置写上extension=cpp_ext