探讨:如何编写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 similar_text 字符串的相似性比较函数
May 26 PHP
php中定时计划任务的实现原理
Jan 08 PHP
php自定义apk安装包实例
Oct 20 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
php批量删除超链接的实现方法
Oct 19 PHP
PHP面向对象详解(三)
Dec 07 PHP
php图片添加文字水印实现代码
Mar 15 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
Yii框架连表查询操作示例
Sep 06 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 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
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
python梯度下降法的简单示例
2018/08/31 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
详解Python文件修改的两种方式
2019/08/22 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
毕业生护理专业个人求职信范文
2014/01/04 职场文书
计算机个人求职信范例
2014/01/24 职场文书
上课睡觉检讨书
2014/01/28 职场文书
总经理人事任命书
2014/06/05 职场文书
经典禁毒标语
2014/06/16 职场文书
苏州园林导游词
2015/02/03 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
教师反邪教心得体会
2016/01/15 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书