win7下用vs2008开发PHP扩展

来源:互联网 发布:主播录音软件 编辑:程序博客网 时间:2024/06/05 17:30
环境:win7 + vs2008 + cygwin + webserver环境(php5.2.13) php5.2.15源码包
生成过程如下:
1、环境配置,安装cygwin,这个在生成PHP扩展的框架时有用到,我的安装目录为e:\cygwin  
  下载地址http://www.cygwin.com/setup.exe
2、安装webserver  下载地址 http://blog.lrenwang.com/down/other/webserver.rar
3、下载php5.2.15源码包,下载地址:http://www.php.net/get/php-5.2.15.tar.gz/from/this/mirror  (我的是在D:\webserver\c\php)
   D:\webserver\c\php\ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录
  $cygwin_path = 'e:\cygwin\bin';
4、安装vs2008,这个时间会久一些
5、如果以上的一切都安装好了,那么转第6步,我们开始开发扩展test

6、在命令行中,cd进入D:\webserver\c\php\ext\目录,输入D:\webserver\php\php.exe ext_skel_win32.php --extname=test,
此时在ext目录下会生成test文件夹及在此文件夹下与扩展相关的文件,包括php_test.h,test.c文件等。
如果php.exe所在目录没有加到PATH中,请在php.exe前面加程序的完整路径

7、打开vs2008,新建基于已有文件的项目,选择VC++,选择文件所在目录,输入项目名称 php_test , 下一步,在项目类型:中选择 动态链接库,next直到完成。
8、修改源码,
打开php_test.h文件,找到PHP_FUNCTION(confirm_test_compiled);在其下面增加一个扩展函数声明:PHP_FUNCTION(test_echo);
打开test.c文件,找到zend_function_entry test_functions[],在其元素中添加 PHP_FE(test_echo,  NULL)
在test.c文件中添加如下代码

PHP_FUNCTION(test_echo)
{
  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, "This is %s's extension.the input string is %s.", "test", arg);
  RETURN_STRINGL(strg, len, 0);
}

9、按F7 build此项目,此时会有文件找不到报错,此乃php部分源码没有包含的原因,右键项目属性,
  选择【属性配置】-> 【C/C++】-> 【常规】-> 【附加包含目录】,
  将源码根目录,main目录,TSRM目录,Zend目录添加到此处我的是
  (”D:\webserver\c\php;D:\webserver\c\php\main;D:\webserver\c\php\TSRM;D:\webserver\c\php\Zend”)
  
10、继续build,此时可能会显示zend_config.h文件找不到,此时为部分宏没有定义,解决方案:
选择项目属性,选择【属性配置】-> 【C/C++】-> 【预定义】-> 【预定义处理器】,在此处理添加

ZEND_DEBUG=0;COMPILE_DL_test;ZTS;ZEND_WIN32;PHP_WIN32;HAVE_test=1;
对于不同的扩展可以将COMPILE_DL_test和HAVE_test中的test替换成你的扩展名


12、继续build,此时可能会显示fatal error LNK1120,
  解决方案:打开项目属性,选择【属性配置】-> 【连接器】->【输入】->【Additional Dependencies】,在此处添加php5ts.lib,
  D:\webserver\c\php\dev\php5ts.lib
另外需要在【工具】->【选项】->【项目和解决方案】->【VC++ 目录】,在【显示以下内容目录:】下拉中,选择库文件,将php5ts.lib所在的路径添加进来,此文件存在于 二进制版本的dev/lib目录下。
13、右键solution属性,将Configuration选择为Release
14、build,在ext\test\Release下会有生成你一个以你的项目名为名称的dll文件(我的为php_test.dll)
15、将php_test.dll文件拷贝到机器中运行的php所在的ext目录,修改php.ini文件,添加一行:extension=php_test.dll,重启apache,
16,运行一个包含了 echo test_echo(”phppan.com”);语句的php文件,可以看到有输出This is test’s extension.the input string is phppan.com.
如果你在启动apache中有报错为:
PHP Warning: PHP Startup: test: Unable to initialize module\nModule compiled with build ID=API20090626,TS\nPHP compiled with build ID=API20090626,TS,VC6\nThese options need to match\n in Unknown on line 0

Warning: PHP Startup: test: Unable to initialize module
Module compiled with build ID=API20090626,TS
PHP compiled with build ID=API20090626,TS,VC6
These options need to match
in Unknown on line 0
你需要在main/config.w32.h中添加如下语句
#define PHP_COMPILER_ID “VC6″ 
原创粉丝点击