探讨:如何编写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 相关文章推荐
sphinx增量索引的一个问题
Jun 14 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
php addslashes 利用递归实现使用反斜线引用字符串
Aug 05 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
TP5框架安全机制实例分析
Apr 05 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程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
Python的Lambda函数用法详解
2019/09/03 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
幼儿园托班开学寄语
2014/01/18 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
关于环保的建议书400字
2014/03/12 职场文书
表彰大会主持词
2014/03/26 职场文书
平面设计专业求职信
2014/08/09 职场文书
支部书记四风对照材料
2014/08/28 职场文书
交通违章检讨书
2014/09/21 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android