探讨:如何编写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下删除字符串中HTML标签的函数
Aug 27 PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 PHP
php有道翻译api调用方法实例
Dec 22 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
PHP中COOKIES使用示例
Jul 26 PHP
composer.lock文件的作用
Feb 03 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
php支付宝系列之电脑网站支付
May 30 PHP
php的扩展写法总结
May 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP学习之整理字符串
2011/04/17 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
IE8 原生JSON支持
2009/04/13 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
react路由配置方式详解
2017/08/07 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
python实现神经网络感知器算法
2017/12/20 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
通过Python实现一个简单的html页面
2020/05/16 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
物理教育专业求职信
2014/06/25 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
研究生导师推荐信
2015/03/25 职场文书
学生会任命书范本
2015/09/21 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL