探讨:如何编写PHP扩展


Posted in PHP onJune 13, 2013

用C/C++扩展PHP的优缺点:
优点:
效率,还是效率
减少PHP脚本的复杂度, 极端情况下, 你只需要在PHP脚本中,简单的调用一个扩展实现的函数,然后你所有的功能都就被扩展实现了
而缺点也是显而易见的:
开发复杂
可维护性降低
开发周期变长, 最简单的一个例子,当你用PHP脚本的时候, 如果你发现某个判断条件出错,你只要修改了这一行,保存,那么就立刻能见效。 而如果是在C/C++编写的PHP扩展中, 那你可需要,修改源码,重新编译,然后重新load进PHP, 然后重启Apache,才能见效。
如果你熟悉C,那么编写一个PHP扩展,并不是什么非常难的事情。 PHP本身就提供了一个框架,来简化你的开发。
最简单的方式来开始一个PHP扩展的开发,是使用PHP提供的扩展框架wizard ext_skel, 它会生成一个PHP扩展所必须的最基本的代码, 要使用它,首先你要下载PHP的源码,或者开发包, 进入PHP源码的ext目录, 就会发现这个工具。
生成一个扩展:
./ext_skel --extname=myext
进入/myext,选择扩展类型:
vi config.m4
下面两种类型选一个就行了:

//(依赖外部库)
dnl PHP_ARG_WITH(myext, for myext support,
dnl Make sure that the comment is aligned:
dnl [ --with-myext Include myext support])
//去掉dnl
 PHP_ARG_WITH(myext, for myext support,
 Make sure that the comment is aligned:
 [  --with-myext             Include myext support])
//或者将 //(不依赖外部库) dnl PHP_ARG_ENABLE(myext, whether to enable myext support,dnl Make sure that the comment is aligned:dnl [ --enable-myext Enable myext support])//去掉dnl
修改头文件php_myext.h:
//PHP_FUNCTION(confirm_myext_compiled); /* For testing, remove later. */
//修改为
PHP_FUNCTION(myext); /* For testing, remove later. */
修改myext.c:
//将
//zend_function_entry myext_functions[] = {
// PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */
// {NULL, NULL, NULL} /* Must be the last line in myext_functions[] */
//};
//修改为
zend_function_entry myext_functions[] = {
PHP_FE(myext, NULL) /* For testing, remove later. */
{NULL, NULL, NULL} /* Must be the last line in myext_functions[] */
};
//在文件底部添加自己的函数
PHP_FUNCTION(myext)
{
zend_printf("Hello World!\n");
}
安装自己的php扩展myext:
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

修改php.ini,添加:
extension = "myext.so"
重启web服务器,查看phpinfo,即可看到自己的扩展:

探讨:如何编写PHP扩展

新建测试php文件:

<?php
myext();

执行此文件,即可看到再熟悉不过的“Hello World!”。

探讨:如何编写PHP扩展

PHP 相关文章推荐
PHP个人网站架设连环讲(三)
Oct 09 PHP
php 特殊字符处理函数
Sep 05 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
Jul 19 PHP
PHP中redis的用法深入解析
Feb 20 PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
PHP APC的安装与使用详解
Jun 13 #PHP
eAccelerator的安装与使用详解
Jun 13 #PHP
探讨Hessian在PHP中的使用分析
Jun 13 #PHP
深入PHP变量存储的详解
Jun 13 #PHP
深入PHP中的HashTable结构详解
Jun 13 #PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 #PHP
php缓冲 output_buffering的使用详解
Jun 13 #PHP
You might like
PHP下MAIL的另一解决方案
2006/10/09 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
js实现秒表计时器
2019/12/16 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
情人节活动策划方案
2014/02/27 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
干部考察材料范文
2014/12/24 职场文书
红白喜事主持词
2015/07/06 职场文书
工作报告范文
2019/06/20 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS