一、所需工具
php源码,这里下载的是 php-5.6.38.tar.gz
deps,这里下载的是 deps-5.6-vc11-x86.7z
vs2012
ed2k://|file|cn_visual_studio_ultimate_2012_x86_dvd_920954.iso|1643802624|A3058CE4F2AD7035DB6E67586D07AAA5|/
可用百度云的离线下载进行下载
cygwin ,它是一个在windows平台上运行的类unix模拟环境,一直点击下一步进行安装
二、编译 PHP
①、首先将 php-sdk-binary-tools-20110915.zip,解压到 F:\php-sdk
解压后的目录如下:
②、开一个 cmd 窗口,切换到 F:\php-sdk 目录下,运行vcvarsall.bat来设置好编译环境变量。
这里vcvarsall.bat的具体目录要根据你自己的安装位置而定。
③、接着,在cmd窗口里继续运行以下命令
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat php56dev
这样,在F:\php-sdk目录下又多了一个php56dev目录。
④、复制 F:\php-sdk\php56dev\vc9 到 F:\php-sdk\php56dev 并重命名为 vc11
⑤、将 deps 解压到 F:\php-sdk\php56dev\vc11\x86,覆盖原有的文件。
应该复制进很多必要的模块/扩展所需的库文件。
⑥、将 PHP-5.6.38 源码目录解压到F:\php-sdk\php56dev\vc11\x86
⑦、进入php源码目录
cd php56dev\vc11\x86\php-5.6.38-src
运行:
buildconf
然后就可以先试着编译php了。最开始,一般编译尽可能少的模块,先让核心能正常编译出来:
configure --disable-all --enable-cli
这一步的主要目的是生成 F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\main\config.w32.h。
php默认是ts模式,使用nts需要加上下面参数
configure --disable-all --enable-cli --disable-zts
这里可能遇到的错误:
A、vc 没有加入环境变量
解决 —— 把 D:\SoftWare\VS2012\VC\bin 加入环境变量,具体目录要根据你自己的安装位置而定。
B、计算机中丢失 mspdb110.dll
解决 —— 复制 D:\SoftWare\VS2012\Common7\IDE\mspdb110.dll 到 D:\SoftWare\VS2012\VC\bin 下
三、创建新扩展 hello
①、ext_skel 和 ext_skel_win32.php
在 F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext 目录下有两个文件:ext_skel 和 ext_skel_win32.php。这两个文件分别是linux、windows下的扩展骨架搭建工具。
此次讲的是Windows中搭建PHP扩展开发环境,所以使用的是ext_skel_win32.php。用它生成的新扩展骨架,可以直接用VS打开。ext_skel是创建扩展的shell,在windows上无法运行,所以必须要有cygwin模拟unix环境。
②、切换到 ext 目录
cd F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext
③、生成 hello 扩展
php ext_skel_win32.php --extname=hello
生成的目录如下:
这里很容易出现错误:
首先:php和php.exe指的是安装在windows上的php,它的根目录里面有php.exe,目的是用来解析php文件,所以我们需要将安装的php目录设置到环境变量中。
其次:如果没有安装cygwin或者没有设置cygwin,就会出现以下错误。所以 ,我们需要安装cygwin,然后打开php源码ext目录中的ext_skel_win32.php ,里面有一个变量叫$cygwin_path = “c:/cygwin/bin”; 将它修改为你安装的目录并保存,try again
④、hello.dsp
出现下图执行结果,表示新扩展骨架生成成功。
现在打开F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext可以看到 hello 文件夹。进入 hello 可以看到 hello.dsp,它就是 VS 的项目文件。
四、编译扩展
①、默认函数
目前新建的扩展中并未创建任何函数接口,但默认的扩展为我们提供了一个测试的函数接口,默认函数的命名规则是:confirm_[extname]_compiled,函数接口:tring confirm_[extname]_compiled(string)。
②、用 vs2012 打开 hello.dsp
③、设置运行库
右键项目:属性-》配置属性-》C/C++-》代码生成,设置运行库:多线程 DLL (/MD)
④、设置编译
右键项目:属性-》配置属性-》C/C++-》高级,设置编译为:编译为 C 代码 (/TC)
⑤、设置活动解决方案配置
右键项目:属性-》配置管理器(右上角)-》活动解决方案,设置:Release_TS
⑥、设置输出文件
右键项目:属性-》配置属性-》链接器》常规,设置输出文件:Release_TS/php_hello.dll。如果不设置,当编译生成扩展后,找起来会比较麻烦。所以这项设置不是必须的。
⑦、增加附加库
解压 php-5.6.38-Win32-VC11-x86.zip 到 F:\
右键项目:属性-》配置属性-》链接器》常规,增加附加库目录:F:\php-5.6.38-Win32-VC11-x86\dev。如果不设置此选项,编译时会报:无法打开输入文件"php5ts.lib"
⑧、最后按F5,执行编译。会生成php_hello.dll
成功1个,表示dll生成成功。
生成的文件在:F:\php-sdk\php56dev\vc11\x86\php-5.6.38-src\ext\hello\Release_TS 目录下
五、使用扩展
①、可以使用 php_hello.php 的 php 版本
由于我们用的是 php-5.6.38-Win32-VC11-x86.zip,所以该扩展只能用在 5.6 Thread Safe (TS) x86
②、拷贝 php_hello.dll 至 F:\php-5.6.38-Win32-VC11-x86\ext下
③、打开 F:\php-5.6.38-Win32-VC11-x86\php.ini,添加 extension=php_hello.dll
④、新建 test.php
echo confirm_my_fopen_compiled("test");
⑤、执行结果
Congratulations! You have successfully modified ext/hello/config.m4. Module test is now compiled into PHP.
六、编译新扩展遇到的问题
①、fatal error C1902: 程序数据库管理器不匹配;请检查安装
mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb110.dll 的版本不同,确定这三个文件的相同版本安装在系统里。
在 VC 安装目录下的\Common7\IDE 目录下拷贝这三个文件到安装目录下的 VC\bin 下即可
②、../main/config.w32.h 打开失败
PHP 源码进行 configure 后才会产生 config.w32.h
③、无法打开输入文件"php5ts.lib"
设置工程属性页中的C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。