win32下用VC扩展PHP全过程
闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不
多说了,进入正题:
一、已经在机器上安装PHP环境的就略过,否则先安装apache+php5(当前用的是PHP5.2),推荐用appserv,可以不安装mysql相关。
二、下载PHP源码,从官方(http://www.php.net/downloads.php)下载 Complete Source Code,我当前版本是PHP5.2.6(最好与当前
运行版本一致),下载完后解压后命名为code,进入code/ext目录,可以看到很多扩展模块的目录(源代码,大家可以看看学习),以
及文件"ext_skel"和"ext_skel_win32.php"用于生成扩展模块框架的脚本(下边说到)。
三、安装cygwin,由于win32下开发PHP扩展模块与*nix下有些不同,故首先我们要模拟一个*nix环境,大家可以从
http://cygwin.cn/site/install/ 下载安装cygwin,网址上有详细的安装说明,安装完后到Cygwin目录下有个Cygwin.bat文件,这
就是我们呆会要用的东西了,然后将存放PHP源码的code目录拷贝到Cygwin目录下,到此Cygwin安装完毕。
四、生成扩展模块框架。运行Cygwin.bat,出现一个模拟*nix环境,运行*nix命令"cd /"到虚拟环境根目录,然后执行"cd
/code/ext"进入code/ext目录下,执行指令"sh ext_skel --extname=myext"(其中myext可自行选用模块名),如果成功的话如下图,
表示基本的扩展目录及文件建立完毕,在ext目录下我们看到已经生成了一个"myext"的扩展模块目录,及目录下的若干文件。
五、生成win32下的该模块工程文件。由于我们在第四点只是生成了基本的扩展文件,为了方便在win32下用VC来开发,我们需要生成
"myext.dsp"等工程文件,这时候就要用到ext目录下的"ext_skel_win32.php"文件,其实网上有很多说明是可以跳过第四点直接
用该文件生成最终框架的,不过我之前试过后不行,故用了上边的笨办法,研究了一下"ext_skel_win32.php",其实他就是在第四点
的基础上生成"myext.dsp"及相关php测试模块文件。于是剥离出来的代码(ext_skel.php 记得$extnam变量要正确)如下:
接着在dos命令行下CD路径到/ext下,用当前机器的PHP执行如:"D:\AppServ\php5\php.exe ext_skel.php",完成后/ext/myext下就
多出了一个myext.dsp文件,接着我们把code/php5ts.lib拷贝到模块目录code/ext/myext下,以上的扩展框架的生成就此结束。
ext_skel.php
<?php
$extname='myext'; //同上这里指定你的模块名 $skel = "skeleton";
foreach($argv as $arg) {
if (strtolower(substr($arg, 0, 9)) == "--extname") {
$extname = substr($arg, 10);
}
if (strtolower(substr($arg, 0, 6)) == "--skel") {
$skel = substr($arg, 7);
}
} $fp = fopen("$skel/skeleton.dsp", "rb");
if ($fp) {
$dsp_file = fread($fp, filesize("$skel/skeleton.dsp"));
fclose($fp); $dsp_file = str_replace("extname", $extname, $dsp_file);
$dsp_file = str_replace("EXTNAME", strtoupper($extname), $dsp_file);
$fp = fopen("$extname/$extname.dsp", "wb");
if ($fp) {
fwrite($fp, $dsp_file);
fclose($fp);
}
} $fp = fopen("$extname/$extname.php", "rb");
if ($fp) {
$php_file = fread($fp, filesize("$extname/$extname.php"));
fclose($fp); $php_file = str_replace("dl('", "dl('php_", $php_file);
$fp = fopen("$extname/$extname.php", "wb");
if ($fp) {
fwrite($fp, $php_file);
fclose($fp);
}
} ?>
六、用VC(未安装的先去下载安装,本文基于VC6.0环境)打开myext.dsp,这时默认的编译会是debug模式,改为release模式(工具条
的"组件"打上钩可见),如下图。
最后在“组建”菜单里选择“组建”即完成扩展的“开发”,生成的"php_myext.dll"一般位于
code/Release_TS目录下。最后将"php_myext.dll"放到PHP正式环境下的ext目录,并修改php.ini,加上“extension=php_myext.dll
”,重启apache,在phpinfo中就可以看到myext的存在了,
或者把/ext/myext/下的myext.php拷贝到访问路径下打开显示:
Functions available in the test extension:
confirm_myext_compiled Congratulations! You have successfully modified ext/myext/config.m4. Module myext is now compiled into PHP.
说到这边已经完成了PHP扩展的创建,具体扩展内的实现还要看大家的C语言编程能力,在此就不做赘述了 :
win32下用VC扩展PHP全过程的更多相关文章
- windows下制作PHP扩展
一.编译PHP 转自:http://demon.tw/software/compile-php-on-windows.html 编译PHP扩展必需的一些头文件需要从php源码中获取,其中有一些配置性的 ...
- Windows下使用NIF扩展Erlang方法
在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...
- Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤
http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...
- windows下开发PHP扩展dll(无需Cygwin)
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...
- Win32下的中断和异常
本文是Matt Pietrek在1997年月10月的MSJ杂志Under The Hood专栏上发表的文章.中断和异常在DOS时代是整个系统的灵魂,但Windows已将其隐藏到了系统深处.Matt P ...
- linux下安装opcache扩展
linux下安装opcache扩展 参考:http://www.php.net/manual/zh/opcache.installation.php 1 2 3 4 5 6 7 wget http ...
- [转载]IIS下开启php扩展失效? 感谢作者 本人泪流满面
用户反应,空间不支持GD.系统环境是IIS PHP. 先用phpinfo探了一下,确实没有找到gd的影子.然后检查php.ini,发现gd扩展没有开启(windows下安装的php,其所有php扩 ...
- cocos2dx c++ 在mac下写的中文凝视,在win32下编译时不通过
今天遇到个奇怪的问题,在mac下写的程序,加的中文凝视,编译没有问题,可是在win32下(使用的时vs2012, win7 64bit 系统)编译就总是报错 最后在中文凝视后 加一个空格,或者 换行, ...
- Windows下安装PHP扩展及资源下载地址(memcached为例)
官方下载的php安装包ext目录里以经包含了常用的php扩展,但某些情况下并不能满足我们项目需求,比如memcache扩展就不在官方的php安装包里.这时就需要我们自己去下载安装. 本文列出php官方 ...
随机推荐
- 文成小盆友python-num6 -反射 ,常用模块
本次主要内容: 内容补充 python中的反射 常用模块 一,内容补充: 利用上次说到的递归的方法来实现阶乘. 说明:利用函数递归的方法来实现阶乘如: 1*2*3*4*5*6*7 代码实现如下: de ...
- 判断Python输入是否为数字
在接收raw_input方法后,判断接收到的字符串是否为数字 例如: str = raw_input("please input the number:") if str.isdi ...
- App 冷启动:给 Android 的 Activity 添加一个背景
2016/8/8 11:11:18 # 纠错 之前写的这篇内容的知识点有误,给大家造成了误导,深感抱歉. android 中给 Activity 设置背景的方法是在 style 文件中设置 windo ...
- iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
现在很多的APP中都有slide view,左右滑动出现侧边菜单栏的功能,Weico这个应用就有. 网上有很多第三方的类库实现了这种效果,其实自己代码写的话也是很简单的,下面我将介绍两种方法实现s ...
- SaltStack运行任务卡住了,怎么办?
将相关的JOB ID杀死即可. salt-run jobs.active salt "*" saltutil.signal_job JOBID 15
- 【转】ubuntu12.04完美安装QQ2012、QQMusic、Foxmail等--wine
原文网址:http://blog.csdn.net/hanmengaidudu/article/details/17616921 其实在这之前,试过无数次的wine模拟,没有一次成功的,也不能说是不成 ...
- Oracle优化笔记
2016-11-22 子查询:标量子查询 内联视图(in-line view) 半连接/反连接 标量子查询 select 后跟子查询 类似自定义函数 可用开窗函数之类的改写 内联视图(in ...
- USB Video Class及其实现
1 Video Class 基础概念Usb协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些Class ...
- uiautomatorviewer 可以查看到android中的web 元素信息
以知乎社区账号登录使用微博账号为例,使用uiautomatorviewer 可以定位到登录框.密码框,需要结合appium的inspector 1.genymotion 模拟器开启,模拟器安卓系统为4 ...
- 解决方案--java执行cmd命令ProcessBuilder--出错Exception in thread "main" java.io.IOException: Cannot run program "dir d:\": CreateProcess error=2(xjl456852原创)
当我尝试在java中通过ProcessBuilder运行window的cmd命令时出现错误: public static void main(String [] args) throws IOExce ...