探讨:如何编写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 相关文章推荐
教你如何把一篇文章按要求分段
Oct 09 PHP
php 代码优化之经典示例
Mar 24 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
PHP代码优化的53个细节
Mar 03 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP实现的多维数组排序算法分析
Feb 10 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封装的连接Mysql类及用法分析
2015/12/10 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
js选项卡的实现方法
2015/02/09 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
如何用Python合并lmdb文件
2018/07/02 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
周鸿祎:教你写创业计划书
2013/12/30 职场文书
教师对学生的寄语
2014/04/03 职场文书
小学二年级学生评语
2014/04/21 职场文书
公司应聘求职信
2014/06/21 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
用python批量解压带密码的压缩包
2021/05/31 Python
MySQL中order by的使用详情
2021/11/17 MySQL
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB