以前在Linux下用C写过PHP扩展,在Windows下是使用VC6来编译的,近来有在Windows下用VC2008做PHP扩展的需要,找了一下资料,发现用VC2008也可以写PHP扩展,现介绍步骤如下:


    首先要下载PHP源代码及Windows下的二进制压缩包(需要解压开后并正确配置php.ini,甚至Apache),因为在编译扩展的过程中我们需要二进制压缩包里的dev/php5ts.lib文件。接着使用PHP源代码目录下的ext/ext_skel_win32.php来生成扩展的骨架类。但ext_skel_win32.php中说要使用cygwin,但我机器上没有装cygwin,另外发现其中实际上只使用到了sh,而我机器上装的MSYS里也有sh,应该可以用的吧,于是就将ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录
$cygwin_path = 'c:\msys\1.0\bin';


    然后设置环境变量,将解压开的PHP二进制包目录(包含php.exe的)以及MSYS的BIN目录加入到PATH环境变量中。在控制台切换到PHP源码ext目录下执行ext_skel_win32.php脚本以生成骨架类:
php ext_skel_win32.php --extname=mytest
这样就在PHP源码的ext目录下生成一个了一个mytest的目录,里面有php_mytest.h, mytest.c和mytest.dsp,可以使用VC2008来打开mytest.dsp,它提示要转换工程。

   设置工程属性页中的C++->代码生成->运行库改为多线程DLL(/MD),将C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。
    点生成->配置管理器->活动解决方案配置先Release_TS,平台为win32。

处理完这些后,还要修改PHP源码中Zend/Zend.h,将
#include <stdio.h>
移动到
#ifdef ZEND_WIN32
# include "zend_config.w32.h"
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(NETWARE)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(__riscos__)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#else
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ':'
#endif
的后面去。 还要修改zend_config.w32.h,将
#define vsnprintf _vsnprintf
这行注释掉(否则编译时会提示不能定义大小为0的常量数组和vsnprintf
相关的错误)。

    这样就可以正常编译了(按Release_TS编译),在PHP源码目录下的Release_TS目录下生成了php_mytest.dll,将其拷贝到PHP二进制文件目录下的ext目录中,修改其php.ini文件,加上extension=php_mytest.dll,在命令行用php -i命令来查看模块是否加载成功了:

mytest
mytest support => enabled

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐