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代码
Dec 06 PHP
PHP5中的this,self和parent关键字详解教程
Mar 19 PHP
PHP性能优化 产生高度优化代码
Jul 22 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
PHP curl使用实例
Jul 02 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
php数组函数array_walk用法示例
May 26 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
同学聚会主持词
2014/03/18 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python