Zihao

Make small but daily progress

0%

Windows下开发php5.5的扩展

讲述在 Windows 下开发PHP的扩展。

windows环境(我个人的)

1
2
3
4
5
6
7
8
9
10
11
windows 8.1 企业版(mac os Boot Camp安装的)

Visual Studio 2012 版本

msysgit (http://msysgit.github.io/ 下载)

php-sdk-binary-tools-20110915.zip (http://windows.php.net/downloads/php-sdk/下载)

deps-5.5-vc11-x86.7z (http://windows.php.net/downloads/php-sdk/下载)

php-5.5.20 (http://php.net/downloads.php下载,这个版本不定自己选择)

第一步

解压php-sdk-binary-tools的二进制包,譬如我解压到我的C:\php-sdk文件夹中,现在的目录结构如下

1
2
3
4
C:\php-sdk
--bin
--script
--share

然后,这个是你已经安装完成了visual studio 2012,打开VS2012 Native Tools Command Prompt命令行工具

1
2
3
4
5
6
#进入目录
cd C:\php-sdk
#设置环境变量
bin\phpsdk_setvars.bat
#创建常用的php-sdk目录
bin\phpsdk_buildtree.bat phpdev

如果我们打开bin\phpsdk_buildtree.bat文件就会发现它只创建到VC9,没有VC11,但是我们如果开发php5.5版本,我们需要的是VC11,这时候我们就要把C:\php-sdk\phpdev\vc9复制一份到C:\php-sdk\phpdev\vc11,现在的目录结构如下:

1
2
3
4
5
C:\php-sdk\phpdev\
--vc6
--vc8
--vc9
--vc11

因为我下载的deps-5.5-vc11-x86.7z,所以我要解压deps-5.5-vc11-x86.7zC:\php-sdk\phpdev\vc11\x86\deps文件夹下覆盖,里边都是我们需要的库文件和一些必要的工具等等。

然后,将我们下载的php-5.5.20.tar.bz2解压到C:\php-sdk\phpdev\vc11\x86\php-5.5.20文件夹中。

编译安装php

回到 VS2012 Native Tools Command Prompt

1
2
3
4
5
6
#进入php源目录文件夹
cd c:\php-sdk\phpdev\vc11\x86\php-5.5.20
buildconf
#查看带的扩展和编译命令
configure --help
php-sdk

如果你没有安装php,现在这里就帮助到你了,可以先编译安装一下php

1
configure --disable-all --enable-cli

然后,你会看到Type 'nmake' to build PHP,然后编译

1
nmake

C:\php-sdk\phpdev\vc11\x86\php-5.5.20\Release_TS文件夹下就生成了php.exe文件,环境变量中加入这个路径,好在命令行中能使用php命令。

开发PHP的第一个扩展

假如我们要开发一个widuu()函数,实现的效果如下

1
2
3
function widuu($string){
return "your first extension {$string} is ok";
}

进入扩展目录,生成扩展文件夹

1
2
3
cd C:\php-sdk\phpdev\vc11\x86\php-5.5.20\ext
#输入php ext_skel_win32.php --extname=扩展名称
php ext_skel_win32.php --extname=widuuweb

这时候我们在C:\php-sdk\phpdev\vc11\x86\php-5.5.20\ext就看到了自己的目录widuuweb,打开widuuweb\php_widuuweb.h,在

1
2
#PHP_MINFO_FUNCTION(widuuweb);下一行写入自己的函数,譬如我定义的是widuu()函数
PHP_FUNCTION(widuu);

打开php_widuuweb.c编写函数,在PHP_FUNCTION(confirm_widuuweb_compiled)

1
2
3
4
5
6
7
8
9
10
11
12
13
PHP_FUNCTION(widuu){

char *arg_string = NULL;
int arg_len,str_len;
char *string;

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"s",&arg_string,&arg_len) == FAILURE){
return;
}

str_len = spprintf(&string,0,"your first extension %.78s is ok",arg_string);
RETURN_STRINGL(string,str_len,0);
}

然后找到PHP_FE(confirm_widuuweb_compiled, NULL),在下边注册你的函数

1
2
3
4
5
const zend_function_entry widuuweb_functions[] = {
PHP_FE(confirm_widuuweb_compiled, NULL) /* For testing, remove later. */
PHP_FE(widuu,NULL)
PHP_FE_END /* Must be the last line in widuuweb_functions[] */
};

修改C:\php-sdk\phpdev\vc11\x86\php-5.5.20\ext\widuuweb\config.w32,去掉

1
// ARG_ENABLE("widuuweb", "enable widuuweb support", "no");

前边的注释,vs命令行,输入cd ..php-5.5.20目录中,输入下面的命令

1
2
3
buildconf --force
#查看扩展
configure --help

如果,有错误,大家可以打开,目录下configure.js查看,我这个出现了错误,是configure.js的4791行,

1
ARG_ENABLE("widuuweb", "enable widuuweb support", "no");  */ 

多了一个*/的注释,去掉就可以了,然后再输入

1
configure --help

就看到了,有一行

1
--enable-widuuweb             enable widuuweb support

然后配置

1
configure --disable-all --enable-cli --enable-widuuweb=shared

php动态扩展

其中--enable-widuuweb=shared动态扩展,正好与静态扩展相对。

然后输入nmake,完成后,我们在C:\php-sdk\phpdev\vc11\x86\php-5.5.20\Release_TS目录下就发现了php_widuuweb.dll文件,可以放到环境中测试了。

如果你本地没有安装php环境,而是跟我一样只是编译了php,如果测试,我建议静态编译看效果

1
2
configure --disable-all --enable-cli --enable-widuuweb=static
nmake

然后,你可以再Release_TS目录下,输入

1
php -r "echo widuu('widuu');"  //输出"your first extension widuu is ok"
  • 本文作者: Zihao Yao
  • 本文链接: https://yaozihao.com/php_dev_windows/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道