探讨:如何编写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自动更新新闻DIY
Oct 09 PHP
Smarty结合Ajax实现无刷新留言本实例
Jan 02 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
php中定时计划任务的实现原理
Jan 08 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
Aug 20 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
PHP实现图片压缩
Sep 09 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
js模拟实现Array的sort方法
2007/12/11 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
Python3基础之条件与循环控制实例解析
2014/08/13 Python
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
中餐厅经理岗位职责
2014/04/11 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
慈善募捐倡议书
2015/04/27 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
JavaScript 数组去重详解
2021/09/15 Javascript