开发前准备工作:
cygwin

visual studio 2012

php编译后的程序
      使用的是 xampp集成安装包,所以编译后的程序路径为D:\xampp\php

php编译前的源码
      使用的是 php-5.6.14-src,路径为D:\Hacfin\Code\PHP\php_sdk_win\php-5.6.14-src

1、修改 “ext_skel_win32.php”文件
      D:\Hacfin\Code\PHP\php_sdk_win\php-5.6.14-src\ext\ext_skel_win32.php,修改cygwin路径。
$cygwin_path = 'c:\cygwin64\bin'; 把$cygwin_path修改为你实际安装cygwin的路径。 

WIN7 使用VS2012编译/开发PHP扩展库_扩展名

 

2、生成PHP扩展开发框架
      在源代码ext目录也就是D:\Hacfin\Code\PHP\php_sdk_win\php-5.6.14-src\ext下,运行cmd。执行php ext_skel_win32.php --extname=<EXT_NAME>,此时会在ext目录下生成<EXT_NAME>目录,这个目录就是进行PHP扩展开发的框架。比如你运行php.exe ext_skel_win32.php --extname=twig,会在ext目录下生成twig目录,这里的twig代表你的php扩展名。

WIN7 使用VS2012编译/开发PHP扩展库_扩展名_02

WIN7 使用VS2012编译/开发PHP扩展库_php_03

 

3、拷贝衔接库
      将D:\xampp\php\dev\php5ts.lib拷贝至 “ext/<EXT_NAME>”中。比如你要开发的PHP扩展名为twig,那么就需要把php5ts.lib拷贝到PHP源文件目录\ext\twig中。 

4、添加“config.w32.h”文件
      在php源代码文件目录里搜索“config.w32.h”,在D:\Hacfin\Code\PHP\php_sdk_win\php-5.6.14-src\win32\build文件夹里找到“config.w32.h.in”,将这个文件复制到E:\php-5.6.9-src\main文件夹里,去掉后面的“.in”。

 

注意:为了让扩展能和php运行环境严格匹配,要根据你的php运行环境的编译版本(php5.6.14是VC11编译的),在config.w32.h文件里加上:

#define PHP_COMPILER_ID "VC11" 

WIN7 使用VS2012编译/开发PHP扩展库_扩展名_04

5、取消预定义宏“LIBZEND_EXPORTS”(否则不可引入zend函数)

进入<EXT_NAME>目录,打开<EXT_NAME>.dsp。  

WIN7 使用VS2012编译/开发PHP扩展库_php扩展_05


 

对于php 7 版本,生成的目录中没有 dsp 文件,所以需要通过VS 选择“文件”--“新建”--“从现有代码创建目录”,形成工程文件。

WIN7 使用VS2012编译/开发PHP扩展库_php_06

配置 C/C++,常规,附加包含目录

D:\Lib\php-7.2.12-src

D:\Lib\php-7.2.12-src\main

D:\Lib\php-7.2.12-src\TSRM

D:\Lib\php-7.2.12-src\Zend

C/C++,预处理器,预处理器定义:

ZEND_DEBUG=0

PHP_EXTENSION

PHP_WIN32

ZEND_WIN32

HAVE_TEST=1(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)

COMPILE_DL_TEST(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)

ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全 这个根据你编译的php是不是线程安全来判断是否加入此变量 ps:我就在这上面吃亏了没对应上导致php不识别扩展)

连接器,输入,附加依赖项:

将 php7ts.lib 的路径放进去