1、cmd进入命令行模式,并进入php-5.6.20-src/ext源代码的ext目录下
输入命令php ext_skel_win32.php --extname=HelloWord
,执行结果如下图:
执行后在ext目录下多了HelloWord
文件夹
文件夹中的HelloWord.dsp
是Viscual C++的工程文件
从php的安装目录中的dev文件夹下,找到php5ts.lib
,复制到创建的HelloWord扩展目录下
用Vs2012打开HelloWord.dsp
工程文件,调试模式选择Release
模式,
F5启动调试,发生错误,提示如下:c:php-5.6.20-srczendzend_config.w32.h(25): fatal error C1083: 无法打开包括文件:“../main/config.w32.h”: No such file or directory
说明main/config.w32.h
文件缺失,网上搜索了诸多办法,均失效,或许是以前的版本有效,现在这里提供正确的解决办法:
添加config.w32.h
文件
在php源代码文件目录里搜索config.w32.h
,在C:php-5.6.20-srcwin32uild
文件夹里找到config.w32.h.in
,将这个文件复制到C:php-5.6.20-srcmain
文件夹里,去掉后面的.in
。
注意:为了让扩展能和php运行环境严格匹配,要根据你的php运行环境的编译版本(php5.6.20是VC11编译的),在config.w32.h
文件里加上:#define PHP_COMPILER_ID "VC11"
此时再重新编译,编译成功,在php-5.6.20-src目录下生成了Release_TS
目录,里面有生成的扩展文件php_HelloWord.dll
此时我们将php_HelloWord.dll
拷贝到C:/php/ext
目录下,并设置php.ini文件增加extension=php_HelloWord.dll
,并重启Apache服务器
此时我们用phpinfo()
函数测试,发现已经成功安装了php_HelloWord.dll扩展
打开HelloWord.c文件
找到如下函数:
PHP_FUNCTION(confirm_HelloWord_compiled) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "HelloWord", arg); RETURN_STRINGL(strg, len, 0); }
在下面增加函数HelloPHP
PHP_FUNCTION(HelloPHP) { RETURN_STRING("Hello PHP Ext!", 1); }
找到如下代码:
const zend_function_entry HelloWord_functions[] = { PHP_FE(confirm_HelloWord_compiled, NULL) /* For testing, remove later. */ PHP_FE_END /* Must be the last line in HelloWord_functions[] */ };
并修改如下:
const zend_function_entry HelloWord_functions[] = { PHP_FE(confirm_HelloWord_compiled, NULL) /* For testing, remove later. */ PHP_FE(HelloPHP, NULL) PHP_FE_END /* Must be the last line in HelloWord_functions[] */ };
重新编译,生成php_HelloWord.dll
此时将php_HelloWord.dll复制到php/ext目录下,我们编写测试php代码如下:
<?php echo HelloPHP(); ?>
可以看到执行结果:
自此第一个简单的扩展开发完成!