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安装问题
Oct 09 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
PHP 压缩文件夹的类代码
Nov 05 PHP
php遍历目录viewDir函数
Dec 15 PHP
PHP获取数组中某元素的位置及array_keys函数应用
Jan 29 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
Apr 08 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
PHP对象相关知识总结
Apr 09 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
Laravel框架实现文件上传的方法分析
Sep 29 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
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
php遍历目录方法小结
2015/03/10 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
vue实现分页栏效果
2019/06/28 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python中if及if-else如何使用
2020/06/02 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
如何理解transaction事务的概念
2015/05/27 面试题
物流合作计划书
2014/01/10 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
求职自我评价范文
2015/03/09 职场文书
校运会班级霸气口号
2015/12/24 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
医生行业员工的辞职信
2019/06/24 职场文书