如何用VC2008编写PHP5的扩展
安装IIS7
以Windows 7为例,在光驱中放入和系统匹配的Windows安装光盘,依次打开“控制面板->程序->打开或关闭Windows功能”,选中 “Internet信息服务”。为了让IIS支持PHP,记得勾选中“Internet信息服务->万维网服务->应用程序开发功能 ->CGI”。
测试
打开浏览器输入http://localhost或http://127.0.0.1。
安装PHP5
下载PHP5的同时,一并把源代码取下来,分别解压缩到C:\PHP-5.2.6 和 C:\PHP-5.2.6-src。把C:\PHP-5.2.6\php.ini-dist 并另存为 php.ini。
打开“IIS管理器->处理程序映射->添加模块映射”对话框,依次
在请求路径中填写*.php;
从模块的下拉列表中选择FastCgiModule;(1)
在可执行文件中填写php-cgi.exe文件的完整路径,例如:C:\PHP-5.2.6\php-cgi.exe;
在名称中随便填写,例如PHPCGI。
测试
添加c:\inetpub\wwwroot\index.php,内容为
打开浏览器输入http://localhost/index.php或http://127.0.0.1/index.php。
安装Cygwin
只要安装sh即可。(2)
生成扩展到源码框架
使用PHP源代码目录下的 ext/ext_skel_win32.php来生成扩展的骨架类。
配置环境变量
需要用到c:\php-5.2.6\php.ini和Cygwin,所以把C:\PHP-5.2.6和C:\Cygwin\bin添加到环境变量PATH中。
生成框架
执行cmd打开一个终端,进入php源代码的ext目录
C:\>cd \php-5.2.6-src\ext
执行php脚本,生产一个名为mytest的扩展到框架
C:\php-5.2.6-src\ext>php ext_skel_win32.php –extname=mytest
编译扩展
用 VC2008打开c:\php-5.2.6-src\ext\mytest\mytest.dsp,确认转换工程,选择编译目标为Release_TS, 这个时候编译会报一个找不到.lib的错误,在C:\PHP-5.2.6\dev中找到php5ts.lib并添加到项目的依赖中即可。重新正确地编译 后,生成的目标库文件会自动保存在c:\php-5.2.6-src\Release_TS\php_mytest.dll。
用命令行编译
VC2008转换.dsp文件后会产生一个解决方案.sln文件。
从开始菜单中打开“Visual Studio 2008 命令提示”,输入“devenv /?”查看帮助。
在本例中,在扩展的源代码项目目录中敲入
devenv mytest.sln /build "Release_TS"
就等同于打开VC2008 IDE进行编译。
devenv mytest.sln /clean “Release_TS”
用于清理项目。
测试
把php_mytest.dll复制到C:\php-5.2.6\
修改c:\php-5.2.6\php.ini,找到extension_dir = "./" (3)
添加一行extension=php_mytest.dll
编辑c:\inetpub\wwwroot\index.php的内容,改成
重启IIS服务
打开浏览器输入http://localhost/index.php或http://127.0.0.1/index.php。
执行正确时会显示一条Congratulations!的话。
此外也可以用php.exe在Windows终端窗口中进行测试。
同样需要把php_mytest.dll添加到php.ini配置文件,以及把该动态库复制到指定目录。
执行CMD命令打开一个Windows终端窗口,在终端窗口中敲入
php -r "echo confirm_mytest_compiled('hello');"
编程参考
函数参数
Types and letter codes used in zend_parse_parameters()
Type | Code | Variable Type |
Boolean | b | zend_bool |
Long | l | long |
Double | d | double |
String | s | char*, int |
Resource | r | zval* |
Array | a | zval* |
Object | o | zval* |
zval | z | zval* |
变量类型
基本变量
Int, Long, Double, Boolean, Null, String(char*)
ZVAL
使用下列宏可以取得ZVAL的类型:
宏 | 返回值 |
Z_TYPE(zval), Z_TYPE_P(zval*), Z_TYPE_PP(zval**) | IS_NULL, IS_BOOL, IS_LONG, IS_DOUBLE, IS_STRING, IS_RESOURCE, IS_ARRAY, IS_OBJECT |
使用下列宏可以取得ZVAL的值,也可用于赋予ZVAL新的值:
Z_LVAL(zval), Z_LVAL_P(zval*), Z_LVAL_PP(zval**) | 返回LONG值,可当作BOOLEAN |
Z_DVAL(zval), Z_DVAL_P(zval*), Z_DVAL_PP(zval**) | 返回DOUBLE值 |
Z_STRVAL(zval),Z_STRVAL_P(zval*), Z_STRVAL_PP(zval**) | 返回字符串char* |
Z_STRLEN(zval),Z_STRLEN_P(zval*),Z_STRLEN_PP(zval**) | 返回字符串长度 int |
* Boolean值和LONG共用同一套宏
转换ZVAL的类型:convert_to_string, convert_to_long等
zval *temp;
为zval*申请内存:ALLOC_INIT_ZVAL(temp)
为zval赋值:ZVAL_LONG(temp, 1234);
Array
需要返回一个Array时,首先把return_value初始化,array_init(return_value);
然后下列函数添加item(s);
函数返回
定义 | 举例 | 说明 |
RETURN_LONG(int) | RETURN_LONG(42); | |
RETURN_DOUBLE(double) | RETURN_DOUBLE(3.142); | |
RETURN_BOOL(bool) | RETURN_BOOL(1); | |
RETURN_NULL(void) | RETURN_NULL(); | |
RETURN_TRUE | RETURN_TRUE; | 宏 |
RETURN_FALSE | RETURN_FALSE; | 宏 |
RETURN_STRING(char*, int) | RETURN_STRING(“ABC”,1); RETURN_STRING(pStr,0); | 扩展DLL会被unload,所以返回的字符串指针可能失效。如果第二个参数为1,RETURN_STRING会自动动态分配一个空间保存字符串;如果第二个参数为0,则不会,这时候第一个参数务必指向一个动态分配的内存,参考emalloc,estrdup。 |
返回RESOURCE,ARRAY,OBJECT |
参考文献
- 在Win32下用VS2008编译PHP扩展 (http://jz123.cn/text/3033828.html)
- Windows7 IIS7下以FastCgi和ISAPI方法安装配置PHP5教程(http://www.leapsoul.cn/?p=753)
- msdev & devenv 的命令行用法(http://www.cppblog.com/rise-worlds/archive/2009/07/23/90892.html)
- Extension Writing Part I: Introduction to PHP and Zend(http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/)
- Extension Writing Part II: Parameters, Arrays, and ZVALs(http://devzone.zend.com/317/extension-writing-part-ii-parameters-arrays-and-zvals/)
- Extension Writing Part III: Resources(http://devzone.zend.com/446/extension-writing-part-iii-resources/)
备注
如果下拉列表中没有FastCgiModule,请参考章节 安装IIS7 重新确认已安装了“Internet信息服务->万维网服务->应用程序开发功能->CGI”。
ext_skel_win32.php中说要使用Cygwin,实际上只使用到了sh,所以可以用其它sh替代,入MSYS。
extension_dir = "./" 指定了PHP-5.2.6为扩展存放的路径。
没有评论:
发表评论