基于Visual c++ 2012的php扩展开发 - HelloWord!
1、cmd进入命令行模式,并进入php-5.6.20-src/ext源代码的ext目录下
输入命令php ext_skel_win32.php --extname=HelloWord
,执行结果如下图:
执行后在ext目录下多了HelloWord
文件夹
文件夹中的HelloWord.dsp
是Viscual C++的工程文件
从php的安装目录中的dev文件夹下,找到php5ts.lib
,复制到创建的HelloWord扩展目录下
用Vs2012打开HelloWord.dsp
工程文件,调试模式选择Release
模式,
F5启动调试,发生错误,提示如下:c:\php-5.6.20-src\zend\zend_config.w32.h(25): fatal error C1083: 无法打开包括文件:“../main/config.w32.h”: No such file or directory
说明main/config.w32.h
文件缺失,网上搜索了诸多办法,均失效,或许是以前的版本有效,现在这里提供正确的解决办法:
添加config.w32.h
文件
在php源代码文件目录里搜索config.w32.h
,在C:\php-5.6.20-src\win32\build
文件夹里找到config.w32.h.in
,将这个文件复制到C:\php-5.6.20-src\main
文件夹里,去掉后面的.in
。
注意:为了让扩展能和php运行环境严格匹配,要根据你的php运行环境的编译版本(php5.6.20是VC11编译的),在config.w32.h
文件里加上:#define PHP_COMPILER_ID "VC11"
此时再重新编译,编译成功,在php-5.6.20-src目录下生成了Release_TS
目录,里面有生成的扩展文件php_HelloWord.dll
此时我们将php_HelloWord.dll
拷贝到C:/php/ext
目录下,并设置php.ini文件增加extension=php_HelloWord.dll
,并重启Apache服务器
此时我们用phpinfo()
函数测试,发现已经成功安装了php_HelloWord.dll扩展
打开HelloWord.c文件
找到如下函数:
PHP_FUNCTION(confirm_HelloWord_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.", "HelloWord", arg);
RETURN_STRINGL(strg, len, 0);
}
在下面增加函数HelloPHP
PHP_FUNCTION(HelloPHP)
{
RETURN_STRING("Hello PHP Ext!", 1);
}
找到如下代码:
const zend_function_entry HelloWord_functions[] = {
PHP_FE(confirm_HelloWord_compiled, NULL) /* For testing, remove later. */
PHP_FE_END /* Must be the last line in HelloWord_functions[] */
};
并修改如下:
const zend_function_entry HelloWord_functions[] = {
PHP_FE(confirm_HelloWord_compiled, NULL) /* For testing, remove later. */
PHP_FE(HelloPHP, NULL)
PHP_FE_END /* Must be the last line in HelloWord_functions[] */
};
重新编译,生成php_HelloWord.dll
此时将php_HelloWord.dll复制到php/ext目录下,我们编写测试php代码如下:
<?php
echo HelloPHP();
?>
可以看到执行结果:
自此第一个简单的扩展开发完成!
基于Visual c++ 2012的php扩展开发 - HelloWord!的更多相关文章
- 基于Visual c++ 2012的php扩展开发 - 环境搭建
软件准备 Apache2.4 php-5.6.20-Win32-VC11-x86 php-5.6.20-src mysql-5.5.45-win32 vcredist_x86.exe vs2012旗舰 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言1
在Visual Studio 2012中使用VMSDK开发领域特定语言(一) 前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...
- 【转】visual studio 2012进行C语言开发[图文]
原文网址:http://blog.csdn.net/chengyafei0104/article/details/9826025 现在大家计算机大概都脱离XP了,so,之前蛮多可以用的编译器,可能放在 ...
- visual studio 2012进行C语言开发[图文]
现在大家计算机大概都脱离XP了,so,之前蛮多可以用的编译器,可能放在我们现在的Win7,win8下面会出现一些比如不兼容了之类的问题.其实,用微软强大的IDE-visual studio系列,也是可 ...
- 用Visual Studio 2012+Xamarin搭建C#开发Andriod的环境
第一步:安装Visual Studio: Visual Studio 2012(或者Visual Studio 2010),原因是目前为止Xamarin for Visual Studio的插件只支持 ...
- 基于Visual C++2012拆解世界五百强面试题--题3
请用C语言实现 输入N,打印N*N矩阵 比如 N = 3, 打印: 1 2 3 8 9 4 7 6 5 N = 4, 打印 1 2 3 4 12 13 14 5 11 16 ...
- 使用 Visual Studio 2012进行C语言开发
1.打开visual studio,选择菜单[文件]->[新建]->[项目],将会弹出新建项目对话框 2.在弹出的新建项目对话框中,选择和填补相应的属性. 3.点击确定之后,会跟着弹出应用 ...
随机推荐
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- Linux命令之umask
一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...
- node.js 入门
什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释,可以自己去搜索了解下,服务器端js不是新技术,只是最近的node.js的火爆让他爆发了,我会在以后的文章里解释什 ...
- weex - 创建项目
初始化 请确保你已经安装了 Node.js,然后全局安装 weex-toolkit. npm install weex-toolkit -g 这条命令会向你命令行环境中注册一个 weex 命令.你可以 ...
- Android无线测试之—UiAutomator UiDevice API介绍六
一.灭屏和唤醒屏幕相关知识: 1)灭屏:按电源键将屏幕熄灭 2)唤醒屏幕:在灭屏状态下按电源键唤醒屏幕 二.灭屏与唤屏相关的API: 返回值 方法名 描述 void wakeUp() 模拟按电源键,如 ...
- 【BZOJ2793】[Poi2012]Vouchers 调和级数
[BZOJ2793][Poi2012]Vouchers Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整 ...
- border inset outset ,border-radius
1. 例子: div{ width:256px; height:256px; border: 10px inset #f00; margin:0 auto; border-radius:255px; ...
- UIApplication的理解
iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: int UIApplicationMain ( int argc, char *a ...
- ECMAScript6补全字符串长度方法padStart()和padEnd()
一.padStart() 1.定义 padStart()方法用另一个字符串(默认为空格)重复填充到对象字符串到指定长度,填充从对象字符串左侧开始,返回新的字符串. 2.语法 str.padStart( ...
- ehcache 配置持久化到硬盘(四)
Ehcache默认配置的话 为了提高效率,所以有一部分缓存是在内存中,然后达到配置的内存对象总量,则才根据策略持久化到硬盘中,这里是有一个问题的,假如系统突然中断运行 那内存中的那些缓存,直接被释放掉 ...