探讨:如何编写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安全配置
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
PHP自定义函数收代码
Aug 01 PHP
写出高质量的PHP程序
Feb 04 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
Dec 25 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
php简单实现sql防注入的方法
Apr 22 PHP
php文件上传、下载和删除示例
Aug 28 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 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出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
解放web程序员的输入验证
2006/10/06 Javascript
Js中sort()方法的用法
2006/11/04 Javascript
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
vue实现选中效果
2020/10/07 Javascript
Eclipse配置python默认头过程图解
2020/04/26 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
个人自我评价分享
2013/12/20 职场文书
教师师德承诺书
2014/03/26 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
户籍证明格式
2014/09/15 职场文书
合作协议书模板
2014/10/10 职场文书
学生检讨书范文
2015/01/27 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android