2012年3月4日星期日

如何用VC2008编写PHP5的扩展 update 1

如何用VC2008编写PHP5的扩展


安装IIS7

以Windows 7为例,在光驱中放入和系统匹配的Windows安装光盘,依次打开“控制面板->程序->打开或关闭Windows功能”,选中 “Internet信息服务”。为了让IIS支持PHP,记得勾选中“Internet信息服务->万维网服务->应用程序开发功能 ->CGI”。

测试

打开浏览器输入http://localhosthttp://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管理器->处理程序映射->添加模块映射”对话框,依次

  1. 在请求路径中填写*.php;

  2. 从模块的下拉列表中选择FastCgiModule;(1)

  3. 在可执行文件中填写php-cgi.exe文件的完整路径,例如:C:\PHP-5.2.6\php-cgi.exe;

  4. 在名称中随便填写,例如PHPCGI。

测试

添加c:\inetpub\wwwroot\index.php,内容为

打开浏览器输入http://localhost/index.phphttp://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”

用于清理项目。

测试

  1. 把php_mytest.dll复制到C:\php-5.2.6\

  2. 修改c:\php-5.2.6\php.ini,找到extension_dir = "./" (3)

添加一行extension=php_mytest.dll

  1. 编辑c:\inetpub\wwwroot\index.php的内容,改成

  2. 重启IIS服务

  3. 打开浏览器输入http://localhost/index.phphttp://127.0.0.1/index.php
    执行正确时会显示一条Congratulations!的话。


此外也可以用php.exe在Windows终端窗口中进行测试。

  1. 同样需要把php_mytest.dll添加到php.ini配置文件,以及把该动态库复制到指定目录。

  2. 执行CMD命令打开一个Windows终端窗口,在终端窗口中敲入
    php -r "echo confirm_mytest_compiled('hello');"


编程参考

函数返回

定义

举例

说明

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



参考文献



备注

  1. 如果下拉列表中没有FastCgiModule,请参考章节 安装IIS7 重新确认已安装了“Internet信息服务->万维网服务->应用程序开发功能->CGI”。

  2. ext_skel_win32.php中说要使用Cygwin,实际上只使用到了sh,所以可以用其它sh替代,入MSYS。

  3. extension_dir = "./" 指定了PHP-5.2.6为扩展存放的路径。

没有评论: