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

[经验分享] 用VS开发PHP扩展

[复制链接]

尚未签到

发表于 2015-8-23 10:12:28 | 显示全部楼层 |阅读模式
  开发前准备工作:
  VS(我用的2013)
  Cygwin(下载地址:http://www.cygwin.com/)
  搭载了php运行环境的IIS7.5 (用来测试)
  php编译后的程序和编译前的源码,我用的当前最新版本5.6.9(下载地址:http://windows.php.net/download/)
  编译后的程序路径:E:\php-5.6.9-nts-Win32-VC11-x86\
  编译前的源码路径:E:\php-5.6.9-src\
  步骤:
  1.安装Cygwin
   DSC0000.png
  
  从网络安装
  
  
  
DSC0001.png
  默认安装C盘
DSC0002.png
  下载缓存随意,安装结束记得删掉,我是放在桌面的
DSC0003.png
DSC0004.png
  在中国,就选http://mirrors.63.com,后面一直下一步到结束。
  2.找到php源码目录我的是(E:\php-5.6.9-src,以下用这个代表源码目录),打开E:\php-5.6.9-src\ext\ext_skel_win32.php
DSC0005.png
  这里改成你的cygwin安装目录,我的就是C盘,所以不用改。
  3.运行cmd,进入E:\php-5.6.9-src\ext\里,运行php.exe  ext_skel_win32.php --extname=test,这里test代表你的php扩展名。
DSC0006.png
  打开E:\php-5.6.9-src\ext\就会看到一个test文件夹,这个就是你的扩展。
  4.打开VS选择“文件”--“新建”--“从现有代码创建目录”
DSC0007.png
  选择C++
DSC0008.png
  这里选择你的php扩展文件夹路径,并且给项目命名
DSC0009.png
  选择“使用 visual studio”,项目类型选择“动态链接库(DLL)项目”,后面一直默认下一步一直到完成。
DSC00010.png
  5.刚开始打开会有很多错误,我们接下来开始配置项目。
DSC00011.png
  先把项目解决方案配置改为Release
DSC00012.png
  右键项目属性,C/C++,常规,附加包含目录,编辑
DSC00013.png
  加入以下几个php源码目录(实际目录以开发者自己的目录为准):
  E:\php-5.6.9-src
  E:\php-5.6.9-src\main
  E:\php-5.6.9-src\TSRM
  E:\php-5.6.9-src\Zend
DSC00014.png
  右键项目属性,C/C++,预处理器,预处理器定义,编辑,加入以下变量:
  ZEND_DEBUG=0
  PHP_EXTENSION
  PHP_WIN32
  ZEND_WIN32
  HAVE_TEST=1(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)
  COMPILE_DL_TEST(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)
  ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全)
DSC00015.png
  生成解决方案,错误信息显示找不到“config.w32.h”,在源代码文件目录里搜索“config.w32.h”,在E:\php-5.6.9-src\win32\build\文件夹里找到“config.w32.h.in”,将这个文件复制到E:\php-5.6.9-src\main\文件夹里,去掉后面的“.in”
  再次生成解决方案,显示错误信息LNK1120
  错误 7 error LNK1120: 5 个无法解析的外部命令 E:\php-5.6.9-src\ext\test\Release\phptest.dll 1 1 phptest
  右键项目属性,连接器,输入,附加依赖项,编辑,将php5.lib的路径放进去(这个文件在php编译后的程序文件夹里,根目录的dev文件夹里)
DSC00016.png
  注意:为了让扩展能和php运行环境匹配,要根据你的php运行环境的编译版本(php5.6.9是VC11编译的),在E:\php-5.6.9-src\main\文件夹里的config.w32.h文件里加上:



#define PHP_COMPILER_ID "VC11"
  
  打开test.c
  找到这一段代码:



PHP_FUNCTION(confirm_test_compiled)
{
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, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "test", arg);
RETURN_STRINGL(strg, len, 0);
}
  将confirm_test_compiled改成test_echo
  再找到这一段代码:



const zend_function_entry test_functions[] = {
PHP_FE(confirm_test_compiled,    NULL)        /* For testing, remove later. */
PHP_FE_END    /* Must be the last line in test_functions[] */
};
  将里面的confirm_test_compiled也改成test_echo
  生成解决方案,在项目根目录的Release文件夹里找到自己的php扩展phptest.dll,复制到php的ext文件夹里,在php.ini里配置上:
  extension=phptest.dll
  重启IIS,新建一个站点,在里面新建一个test.php文件



<?php
echo test_echo("123");
  运行得到结果:
DSC00017.png
  这个test_echo函数,就是我们自己的自定义函数了,你也可以根据需求,开发自己的扩展来提高php的性能。
  

运维网声明 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-102879-1-1.html 上篇帖子: 一个PHP的QRcode类,与大家分享 下篇帖子: 谁的头最牛逼?关于Php的头信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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