探讨:如何编写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 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
PHP file_exists问题杂谈
May 07 PHP
PHP5函数小全(分享)
Jun 06 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
PHP addslashes()函数讲解
Feb 03 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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
关于js与php互相传值的介绍
2013/06/25 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
php swoft框架实例用法
2020/12/22 PHP
JavaScript的Function详细
2006/11/14 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python3 能振兴 Python的原因分析
2014/11/28 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
美国精油公司:Plant Therapy
2019/05/17 全球购物
厂区绿化方案
2014/05/08 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
幼儿园个人总结
2015/02/28 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript