探讨:如何编写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的session cookie错误
Aug 09 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
php文件下载处理方法分析
Apr 22 PHP
培养自己的php编码规范
Sep 28 PHP
浅析php如何实现App常用的秒发功能
Aug 03 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
php在linux环境中如何使用redis详解
Dec 15 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的控制语句
2006/10/09 PHP
PHP新手上路(七)
2006/10/09 PHP
php获取根域名方法汇总
2014/10/28 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Javascript 布尔型分析
2008/12/22 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
详解Python中heapq模块的用法
2016/06/28 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
应届行政管理专业个人自我评价
2013/12/28 职场文书
跟单文员岗位职责
2014/01/03 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
建筑学专业自荐书
2014/07/09 职场文书
委托公证书格式
2015/01/26 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
MySQL之select、distinct、limit的使用
2021/11/11 MySQL