设为首页 收藏本站
查看: 756|回复: 0

[经验分享] 尝试在Win32(Win 7)下用VS2010编译PHP扩展 (初步)

[复制链接]
发表于 2015-8-24 09:22:31 | 显示全部楼层 |阅读模式
  看了一下网上的文章,也有想学习一下PHP扩展的冲动,就试着写了一下,刚刚调试成功,写出来分享一下。
  首先参考一下人家的文章 在Win32下用VC2008编译PHP扩展:



以前在Linux下用C写过PHP扩展,在Windows下是使用VC6来编译的,近来有在Windows下用VC2008做PHP扩展的需要,找了一下资料,发现用VC2008也可以写PHP扩展,现介绍步骤如下:

    首先要下载PHP源代码及Windows下的二进制压缩包(需要解压开后并正确配置php.ini,甚至Apache),因为在编译扩展的过程中我们需要二进制压缩包里的dev/php5ts.lib文件。接着使用PHP源代码目录下的ext/ext_skel_win32.php来生成扩展的骨架类。但ext_skel_win32.php中说要使用cygwin,但我机器上没有装cygwin,另外发现其中实际上只使用到了sh,而我机器上装的MSYS里也有sh,应该可以用的吧,于是就将ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录
$cygwin_path = 'c:\msys\1.0\bin';

    然后设置环境变量,将解压开的PHP二进制包目录(包含php.exe的)以及MSYS的BIN目录加入到PATH环境变量中。在控制台切换到PHP源码ext目录下执行ext_skel_win32.php脚本以生成骨架类:
php ext_skel_win32.php --extname=mytest
这样就在PHP源码的ext目录下生成一个了一个mytest的目录,里面有php_mytest.h, mytest.c和mytest.dsp,可以使用VC2008来打开mytest.dsp,它提示要转换工程。
    设置工程属性页中的C++->代码生成->运行库改为多线程DLL(/MD),将C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。
    点生成->配置管理器->活动解决方案配置先Release_TS,平台为win32。

处理完这些后,还要修改PHP源码中Zend/Zend.h,将
#include <stdio.h>
移动到
#ifdef ZEND_WIN32
# include "zend_config.w32.h"
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(NETWARE)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#elif defined(__riscos__)
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ';'
#else
# include <zend_config.h>
# define ZEND_PATHS_SEPARATOR        ':'
#endif
的后面去。 还要修改zend_config.w32.h,将
#define vsnprintf _vsnprintf
这行注释掉(否则编译时会提示不能定义大小为0的常量数组和vsnprintf
相关的错误)。
    这样就可以正常编译了(按Release_TS编译),在PHP源码目录下的Release_TS目录下生成了php_mytest.dll,将其拷贝到PHP二进制文件目录下的ext目录中,修改其php.ini文件,加上extension=php_mytest.dll,在命令行用php -i命令来查看模块是否加载成功了:
mytest
mytest support => enabled
  
  以上基本上没用问题,只是到了PHP5.3.10后PHP开发组已经将上面的inlcude问题和下面的PRINTF问题解决了,不用改其他源代码,直接编译即可。
  但是到了我这儿发现用这个扩展时的时候加载失败,查看apache错误日志



Module compiled with build ID=API20060626,TS
PHP    compiled with build ID=API20090626,TS,VC9
  我用的 PHP Version 5.3.10 ,Compiler MSVC9 (Visual C++ 2008)  不清楚的自己phpinfo().一开始是我下载的C源代码不对是5.2.17的,后来改到5.3.10后发现从VERY CD这个源下载的少了config.w32.h这个文件,于是我从5.2拷了个过来。发现还是有问题



Module compiled with build ID=API20090626,TS
PHP    compiled with build ID=API20090626,TS,VC9
  
模块没有compiled ID,但我用的VS2010肯定是VC9的,说明C源代码有问题,找了一下资料(点此),在main/config.w32.h中添加如下语句 #define PHP_COMPILER_ID "VC9"
  好了,OK!
  如图
DSC0000.jpg
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103260-1-1.html 上篇帖子: php开发和调试环境的配置+出现 57% waiting for xdebug session的问题 下篇帖子: php 冒泡排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表