php的扩展写法总结


Posted in PHP onMay 14, 2019

为什么要用C扩展

C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。

另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。

第一步

下载PHP的源代码,如php-5.4.16。解压后进入php-5.4.16\ext目录。输入 ./ext_skel ?extname=myext,myext就是扩展的名称,执行后生成myext目录。

ext_skel是PHP官方提供的用于生成php扩展骨架代码的工具。

cd myext。可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。

第二步

修改config.m4,将

dnl PHP_ARG_WITH(myext, for myext support,

dnl Make sure that the comment is aligned:

dnl [ --with-myext       Include myext support])

修改为

PHP_ARG_WITH(myext, for myext support,

[ --with-myext       Include myext support])

下边还有一个 ?enable-myext,是表示编译到php内核中。with是作为动态链接库载入的。

第三步

修改php_myext.h,看到PHP_FUNCTION(confirm_myext_compiled); 这里就是扩展函数声明部分,可以增加一行 PHP_FUNCTION(myext_helloworld); 表示声明了一个myext_helloworld的扩展函数。

然后修改myext.c,这个是扩展函数的实现部分。

const zend_function_entry myext_functions[] = {

    PHP_FE(confirm_myext_compiled, NULL)      /* For testing, remove later. */

    PHP_FE(myext_helloworld, NULL)

    PHP_FE_END   /* Must be the last line in myext_functions[] */

};

这的代码是将函数指针注册到Zend引擎,增加一行PHP_FE(myext_helloworld, NULL)(后面不要带分号)。

第四步

在myext.c末尾加myext_helloworld的执行代码。

PHP_FUNCTION(myext_helloworld)

{

    char *arg = NULL;

  int arg_len, len;

  char *strg;

  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

    return;

  }

  php_printf("Hello World!\n");

  RETRUN_TRUE;

}

zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX宏是用来返回给PHP数据。

第五步

在myext目录下依次执行phpize、./configure 、make、make install。然后修改php.ini加入extension=myext.so

执行php -r “myext_helloworld(‘test');”,输出hello world!

PHP 相关文章推荐
php出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
PHP学习笔记之session
May 06 PHP
详解PHP PDO简单教程
May 28 PHP
PHP与SQL语句写一句话木马总结
Oct 11 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 #PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 #PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 #PHP
PHP使用Redis实现Session共享的实现示例
May 12 #PHP
如何让PHP编码更加好看利于阅读
May 12 #PHP
Yii2处理密码加密及验证的方法
May 12 #PHP
php和asp语法上的区别总结
May 12 #PHP
You might like
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
Python入门之modf()方法的使用
2015/05/15 Python
python3抓取中文网页的方法
2015/07/28 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
写好自荐信要注意的问题
2013/11/10 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
优秀教师主要事迹
2014/02/01 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
中学社团活动总结
2015/05/07 职场文书
初中运动会前导词
2015/07/20 职场文书
中学生运动会广播稿
2015/08/19 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Golang并发工具Singleflight
2022/05/06 Golang