探讨:如何编写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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
php 数组排序 array_multisort与uasort的区别
Mar 24 PHP
php中设置多级目录session的问题
Aug 08 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
php中如何执行linux命令详解
Nov 06 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php数组去除空值函数分享
2015/02/02 PHP
php微信开发之关注事件
2018/06/14 PHP
php输出形式实例整理
2020/05/05 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
checkbox使用示例
2013/08/23 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
python uuid模块使用实例
2015/04/08 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
python编程嵌套函数实例代码
2018/02/11 Python
Win8下python3.5.1安装教程
2020/07/29 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
机械专业个人求职自荐信格式
2013/09/21 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
标准单位租车协议书
2014/09/23 职场文书
员工工作能力评语
2014/12/31 职场文书
质检员岗位职责范本
2015/04/07 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android