用VS开发PHP扩展
开发前准备工作:
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
从网络安装
默认安装C盘
下载缓存随意,安装结束记得删掉,我是放在桌面的
在中国,就选http://mirrors.163.com,后面一直下一步到结束。
2.找到php源码目录我的是(E:\php-5.6.9-src,以下用这个代表源码目录),打开E:\php-5.6.9-src\ext\ext_skel_win32.php
这里改成你的cygwin安装目录,我的就是C盘,所以不用改。
3.运行cmd,进入E:\php-5.6.9-src\ext\里,运行php.exe ext_skel_win32.php --extname=test,这里test代表你的php扩展名。
打开E:\php-5.6.9-src\ext\就会看到一个test文件夹,这个就是你的扩展。
4.打开VS选择“文件”--“新建”--“从现有代码创建目录”
选择C++
这里选择你的php扩展文件夹路径,并且给项目命名
选择“使用 visual studio”,项目类型选择“动态链接库(DLL)项目”,后面一直默认下一步一直到完成。
5.刚开始打开会有很多错误,我们接下来开始配置项目。
先把项目解决方案配置改为Release
右键项目属性,C/C++,常规,附加包含目录,编辑
加入以下几个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
右键项目属性,C/C++,预处理器,预处理器定义,编辑,加入以下变量:
ZEND_DEBUG=0
PHP_EXTENSION
PHP_WIN32
ZEND_WIN32
HAVE_TEST=1(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)
COMPILE_DL_TEST(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别)
ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全)
生成解决方案,错误信息显示找不到“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文件夹里)
注意:为了让扩展能和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, , "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "test", arg);
RETURN_STRINGL(strg, len, );
}
将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");
运行得到结果:
这个test_echo函数,就是我们自己的自定义函数了,你也可以根据需求,开发自己的扩展来提高php的性能。
用VS开发PHP扩展的更多相关文章
- 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...
- Sublime Text 前端开发常用扩展插件推荐
Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...
- 【翻译】我钟爱的Visual Studio前端开发工具/扩展
原文:[翻译]我钟爱的Visual Studio前端开发工具/扩展 怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾
前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...
- 手把手教你开发chrome扩展
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...
- 【逆向知识】开发WinDBG扩展DLL
如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- windows下开发PHP扩展dll(无需Cygwin)
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
随机推荐
- android 性能优化
本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...
- J2ObjC 1.0 发布,将 Java 转换为 Objective-C
J2ObjC 是一个Google开发的开源工具,用于将Java代码转换为Objective-C代码.其目的是为了能在iOS平台上重用Android平台.web服务器端的Java代码.服务器端代码的转换 ...
- 我的第一个React Native App
我用了三天时间实现了一个相对比较完整的React Native 新闻发布类型的示例.应用做得很简单,但大多React Native的组件都有用到,今天做一个分享(由于我电脑是Windows系统,所以只 ...
- django中html过滤器filter
http://blog.csdn.net/iloveyin/article/details/49560559 safe让Html标签以及一些特殊符号(如<)生效,下面以例子说明: # value ...
- Linux启动报错missing operating system
用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
- 《java JDK7 学习笔记》之类和对象
1.在java中,要产生对象必须先定义类,类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例对象要使用new关键词.以类名声明的变量,称为参考名称.参考变量或直接叫参考. 2.想 ...
- static
静态数据成员,用关键字static声明,该类的所有对象维护该成员的同一个拷贝(包括该类派生类的对象,即派生类对象与基类对象共享基类的静态数据成员. 1. Static数据成员必须在类外部定义,且正好定 ...
- Android 手势操作识别
(转自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html) 首先,在Android系统中,每一次手势交互都会依照 ...
- 004.测试解析php,安装discuz
一.配置解析php 编辑nginx配置文件/usr/local/nginx/conf/nginx.conf [root@huh ~]# vim /usr/local/nginx/conf/nginx. ...