探讨:如何编写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 相关文章推荐
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
表单复选框向PHP传输数据的代码
Nov 13 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
PHP 身份验证方面的函数
Oct 11 PHP
php set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
php通过session防url攻击方法
Dec 10 PHP
四个PHP非常实用的功能
Sep 29 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
详解PHP神奇又有用的Trait
Mar 25 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
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
angular多语言配置详解
2019/05/16 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
Python 的 Socket 编程
2015/03/24 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
python实现超市商品销售管理系统
2019/10/25 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
公司行政经理岗位职责
2013/12/24 职场文书
销售辞职报告范文
2014/01/12 职场文书
统计系教授推荐信
2014/02/28 职场文书
2014年教务处工作总结
2014/12/03 职场文书
2015年征兵工作总结
2015/07/23 职场文书
小学运动会开幕词
2016/03/04 职场文书
世界十大狙击步枪排行榜
2022/03/20 杂记
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python