Windows中搭建PHP扩展开发环境

一、提前准备

下载并安装VS2008

下载PHP5.4.5程序:

NTS下载

TS下载

其中php二进制包分为VC6、VC8、VC9及TS和NTS版本。

VC6、VC8、VC9分别对应VC6、VC2005、VC2008

TS表示(Thread Safe),当以ISAPI(IIS SERVER)允许时,因为是单进程中执行多线程,为避免内存泄漏和共享变量安全,建议使用TS版本。

当以FAST_CGI等以单一进程来执行,这样就无需进行线程的安全检查。


下载PHP5.4.5源码

下载PHP-SDK

下载MSYS,它包括Windows下linux编译器的实现

下载deps


下面的配置基础,以f:\php_stdio文件夹为基础


二、编译PHP

首先下载php-sdk,先下载较新的php-sdk-binary-tools-20110915.zip,解压到

目录下。注意,解压后,这个目录下应该有bin和script子目录。

开一个cmd窗口,切换到f:\php_stdio\php-sdk目录下,运行vcvarsall.bat来设置好编译环境变量。

这里vcvarsall.bat的具体目录要根据你自己的安装位置而定。

接着,进入在cmd窗口里继续运行以下命令:

这样,在f:\php_stdio\php-sdk目录下又多了一个php54dev目录。

接着继续将deps解压到

目录下。原来这个目录下的deps目录下的所有子目录均是空目录,解压后,应该复制进很多必要的模块/扩展所需的库文件。

接下来,将PHP-5.4.5源码目录复制一份到

目录下。进入php源码目录

运行

然后就可以先试着编译php了。最开始,一般编译尽可能少的模块,先让核心能正常编译出来:


这一步的主要目的是生成config.w32.h,如果需要生成PHP,可以继续执行


nmake clean; nmake

php5.4最核心部分及一个命令行工具就编译出来了。nmake clean是为了避免遗留编译中间结果文件带来干扰。


三、创建新扩展my_fopen

PHP扩展的基础结构相同,为方便开发PHP提供了ext_skel和ext_skel_win32.php分别是linux、windows下的扩展骨架搭建工具。

此次讲的是Windows中搭建PHP扩展开发环境,所以使用的是ext_skel_win32.php。用它生成的新扩展骨架,可以直接用VS打开。

Windows中筹建PHP扩展开发环境-LMLPHP

Windows中筹建PHP扩展开发环境-LMLPHP

上图是ext_skel_win32.php支持的参数

常用的主要是--extname和--proto:

extname:指定扩展的名称

proto:为了便于快速构建函数骨架,可以创建一个文件,并写入各函数的定义。


cd f:\php_stdio\php-sdk\php54dev\vc9\x86\php-5.4.5\ext
php ext_skel_win32.php --extname=my_fopen
登录后复制

Windows中筹建PHP扩展开发环境-LMLPHP

Windows中筹建PHP扩展开发环境-LMLPHP

出现上述执行结果,表示新扩展骨架生成成功,现在打开f:\php_stdio\php-sdk\php54dev\vc9\x86\php-5.4.5\ext可以看到my_fopen文件夹。进入my_fopen可以看到my_fopen.dsp,它就是VS的项目文件。

现在可以开发你想要的扩展程序了。

Windows中筹建PHP扩展开发环境-LMLPHP

Windows中筹建PHP扩展开发环境-LMLPHP


四、编译、使用扩展

目前新建的扩展中并未创建任何函数接口,但默认的扩展为我们提供了一个测试的函数接口,

默认函数的命名规则是:confirm_[extname]_compiled

函数接口:tring confirm_[extname]_compiled(string)


1.用VS打开my_fopen.dsp

2.设置项目属性-》配置属性-》C/C++-》代码生成,设置运行库:多线程 DLL (/MD)

3.设置项目属性-》配置:切换到Release_TS

Windows中筹建PHP扩展开发环境-LMLPHP

4.设置项目属性-》配置属性-》C/C++-》高级,设置编译为:编译为 C 代码 (/TC)

5.设置项目属性-》配置属性-》链接器》常规,设置输出文件:Release_TS/php_my_fopen.dll。

如果不设置,当编译生成扩展后,找起来会比较麻烦。所以这项设置不是必须的。

6.设置项目属性-》配置属性-》链接器》常规,增加附加库目录:F:\php_work\php-5.4.5\dev

如果不设置此选项,编译时会报:无法打开输入文件“php5ts.lib”


7.最后按F5,执行编译。会生成php_my_fopen.dll

Windows中筹建PHP扩展开发环境-LMLPHP

成功1个,表示dll生成成功。


现在扩展已经编译成功,接下来是在PHP中使用它。

8.拷贝php_my_fopen.dll至F:\php_work\php-5.4.5\ext下

8.打开F:\php_work\php-5.4.5\php.ini,添加extension=ext/php_my_fopen.dll

9.新建F:\php_work\test.php


五、编译新扩展遇到的问题

1.fatal error C1902: 程序数据库管理器不匹配;请检查安装
mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb80.dll 的版本不同,确定这三个文件的相同版本安装在系统里。
在VC安装目录下的\Common7\IDE 目录下拷贝这三个文件到 安装目录下的VC\bin下即可

2. ../main/config.w32.h打开失败
PHP源码进行configure后才会产生config.w32.h

3.无法打开输入文件“php5ts.lib”
设置工程属性页中的C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。


09-16 04:55