用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 ...
随机推荐
- Activity详解二 activity数据传递
首先看效果图: 1.Bundle类的作用 Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值.相对于Map,它提供了各种常用类型的putXxx()/getXxx()方 ...
- 课程上线 -“新手入门 : Windows Phone 8.1 开发”
经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...
- Scrum vs. PMP vs. PRINCE2的发展趋势图
这时2013年来自Google Trends的两幅图,数据来自对“Jobs and Education”的统计,体现了这三种认证,或者视为三种项目实施方式的趋势. 下图是全球的趋势: 下图是美国的趋势 ...
- SQL Server高级查询
简介 关于数据库,我们经常会听说"增查删改"之类的词语,听起来很简单,但是如果想要准确的获取到需要的数据的话,还是要花点功夫的.下面由我来和大家谈谈高级查询的用法以及和普通查询的区 ...
- 搭建一个Mongodb (Windows) 版本
因为有项目需要借助nosql 做一个中间层,所以选择了Mongodb 来搞,其实之前呢已经搭建过这部分的环境,这次再次搭建也是记录一下,当时给自己的一个扫盲123教程 借助Mongodb 其实也是缓存 ...
- 问题解决——MFC error RC2170: bitmap file res\XXXXXXX.png is not in 3.00 format
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- java实现串口通讯
一. 准备工作 1. 点击此下载java串口通讯相关工具 2. 将RXTXcomm.jar放到 %JAVA_HOME%\jre\lib\ext\ 目录下,工程中引入该jar包 3. 将rxtxSe ...
- Json学习笔记
一.昨天内容回顾 创建ajax对象 a) 主流浏览器 new XMLHttpRequest(); b) IE浏览器 new ActiveXObject("Msxml2.XMLHTTP. ...
- linux中的权限对于文件和目录的重要性
对于文件 r 可以读取文件的实际内容 w 可以编辑文件的内容 x 文件可以被系统执行 对于目录 r 具有读取目录的结构列表,也就是说你可以用ls命令查看目录下的内容列表 w 可以建立新的文件,删除文件 ...
- 测试环境搭建心得 vs2008+SQL2008 PHP+APACHE+mysql Team Foundation Server2013
大四即将结束,大学的最后一个假期,找到一份实习工作,担任测试工程师.在过年前的最后一周入职,干了一周的活儿.主要工作就是搭建测试环境. VMware 主要熟悉VMware软件,装系统基本都没什么问题. ...