免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8425 | 回复: 7
打印 上一主题 下一主题

win32下用VC扩展PHP全过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-28 17:53 |只看该作者 |倒序浏览
过年闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不

多说了,进入正题:

一、已经在机器上安装PHP环境的就略过,否则先安装apache+php5(当前用的是PHP5.2),推荐用appserv,可以不安装mysql相关。




二、下载PHP源码,从官方(http://www.php.net/downloads.php)下载 Complete Source Code,我当前版本是PHP5.2.6(最好与当前

运行版本一致),下载完后解压后命名为code,进入code/ext目录,可以看到很多扩展模块的目录(源代码,大家可以看看学习),以

及文件"ext_skel"和"ext_skel_win32.php"用于生成扩展模块框架的脚本(下边说到)。






三、安装cygwin,由于win32下开发PHP扩展模块与*nix下有些不同,故首先我们要模拟一个*nix环境,大家可以从

http://cygwin.cn/site/install/ 下载安装cygwin,网址上有详细的安装说明,安装完后到Cygwin目录下有个Cygwin.bat文件,这

就是我们呆会要用的东西了,然后将存放PHP源码的code目录拷贝到Cygwin目录下,到此Cygwin安装完毕。






四、生成扩展模块框架。运行Cygwin.bat,出现一个模拟*nix环境,运行*nix命令"cd /"到虚拟环境根目录,然后执行"cd

/code/ext"进入code/ext目录下,执行指令"sh ext_skel --extname=myext"(其中myext可自行选用模块名),如果成功的话如下图,

表示基本的扩展目录及文件建立完毕,在ext目录下我们看到已经生成了一个"myext"的扩展模块目录,及目录下的若干文件。








五、生成win32下的该模块工程文件。由于我们在第四点只是生成了基本的扩展文件,为了方便在win32下用VC来开发,我们需要生成

"myext.dsp"等工程文件,这时候就要用到ext目录下的"ext_skel_win32.php"文件,其实网上有很多说明是可以跳过第四点直接

用该文件生成最终框架的,不过我之前试过后不行,故用了上边的笨办法,研究了一下"ext_skel_win32.php",其实他就是在第四点

的基础上生成"myext.dsp"及相关php测试模块文件。于是剥离出来的代码(ext_skel.php 记得$extnam变量要正确)如下:
接着在dos命令行下CD路径到/ext下,用当前机器的PHP执行如:"D:\AppServ\php5\php.exe ext_skel.php",完成后/ext/myext下就

多出了一个myext.dsp文件,接着我们把code/php5ts.lib拷贝到模块目录code/ext/myext下,以上的扩展框架的生成就此结束。


ext_skel.php

  1. <?php
  2. $extname='myext'; //同上这里指定你的模块名

  3. $skel = "skeleton";
  4. foreach($argv as $arg) {
  5.         if (strtolower(substr($arg, 0, 9)) == "--extname") {
  6.                 $extname = substr($arg, 10);
  7.         }
  8.         if (strtolower(substr($arg, 0, 6)) == "--skel") {
  9.                 $skel = substr($arg, 7);
  10.         }
  11. }

  12. $fp = fopen("$skel/skeleton.dsp", "rb");
  13. if ($fp) {
  14.         $dsp_file = fread($fp, filesize("$skel/skeleton.dsp"));
  15.         fclose($fp);
  16.        
  17.         $dsp_file = str_replace("extname", $extname, $dsp_file);
  18.         $dsp_file = str_replace("EXTNAME", strtoupper($extname), $dsp_file);
  19.         $fp = fopen("$extname/$extname.dsp", "wb");
  20.         if ($fp) {
  21.                 fwrite($fp, $dsp_file);
  22.                 fclose($fp);
  23.         }
  24. }

  25. $fp = fopen("$extname/$extname.php", "rb");
  26. if ($fp) {
  27.         $php_file = fread($fp, filesize("$extname/$extname.php"));
  28.         fclose($fp);
  29.        
  30.         $php_file = str_replace("dl('", "dl('php_", $php_file);
  31.         $fp = fopen("$extname/$extname.php", "wb");
  32.         if ($fp) {
  33.                 fwrite($fp, $php_file);
  34.                 fclose($fp);
  35.         }
  36. }

  37. ?>
复制代码





六、用VC(未安装的先去下载安装,本文基于VC6.0环境)打开myext.dsp,这时默认的编译会是debug模式,改为release模式(工具条

的"组件"打上钩可见),如下图。

最后在“组建”菜单里选择“组建”即完成扩展的“开发”,生成的"php_myext.dll"一般位于

code/Release_TS目录下。最后将"php_myext.dll"放到PHP正式环境下的ext目录,并修改php.ini,加上“extension=php_myext.dll

”,重启apache,在phpinfo中就可以看到myext的存在了,

或者把/ext/myext/下的myext.php拷贝到访问路径下打开显示:

  1. Functions available in the test extension:
  2. confirm_myext_compiled

  3. Congratulations! You have successfully modified ext/myext/config.m4. Module myext is now compiled into PHP.
复制代码





说到这边已经完成了PHP扩展的创建,具体扩展内的实现还要看大家的C语言编程能力,在此就不做赘述了

[ 本帖最后由 bs 于 2009-10-23 23:45 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-10 12:10 |只看该作者
在线生成 win32下的PHP扩展(beta),C工程,可直接编译生成扩展。
http://mmosite.net/phpext/ext.php

下载后记得配置好php5ts.lib路径,编译后PHP5.2版本下正常运行。

论坛徽章:
0
3 [报告]
发表于 2009-07-18 09:51 |只看该作者
fangbian

论坛徽章:
0
4 [报告]
发表于 2009-07-18 13:15 |只看该作者
二楼的那个真方便,不错

论坛徽章:
0
5 [报告]
发表于 2009-07-18 18:09 |只看该作者
没有继续维护,新版本可能有兼容问题

论坛徽章:
0
6 [报告]
发表于 2009-07-19 05:13 |只看该作者

回复 #5 bs 的帖子

目前只是在linux里有测试做一些简单扩展,没有在win里用vc开发过,不过还是标记下,以后可测试下

论坛徽章:
0
7 [报告]
发表于 2011-07-11 09:12 |只看该作者
好文章啊!很受用
我按这个步骤做了下,过程中缺失config.w32.h头文件,于是下载了一个
生成了dll,复制到ext,修改ini,重启apache
可还是没有达到结果,
undefined function
phpinfo()里也没有看到myext....

求助啊!

论坛徽章:
0
8 [报告]
发表于 2011-12-31 14:50 |只看该作者
哎,再不学都忘光了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP