探讨:如何编写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产生随机字符串函数
Dec 06 PHP
php时间不正确的解决方法
Apr 09 PHP
php 引用(&amp;)详解
Nov 20 PHP
PHP 金额数字转换成英文
May 06 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 PHP
PHP的imageTtfText()函数深入详解
Mar 03 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
SONY SRF-40W电路分析
2021/03/02 无线电
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
基于python实现图片转字符画代码实例
2020/09/04 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
应届生会计求职信
2013/11/11 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
校园安全教育广播稿
2014/02/17 职场文书
纠风工作实施方案
2014/03/15 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
个人四风对照检查材料
2014/09/26 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
工作调动申请报告
2015/05/18 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
Python3接口性能测试实例代码
2021/06/20 Python