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 生成饼图 三维饼图
Sep 28 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
php eval函数用法总结
Oct 31 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
php使用百度天气接口示例
Apr 22 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
destoon二次开发模板及调用语法汇总
Jun 21 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
php给数组赋值的实例方法
Sep 26 PHP
解决php扩展安装不生效问题
Oct 25 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+mysql扎实个人基本功
2008/03/27 PHP
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
php的ajax简单实例
2014/02/27 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
layer.prompt输入层的例子
2019/09/24 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
Python 去除字符串中指定字符串
2020/03/05 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
给海归自荐信的建议
2013/12/13 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
年终考核实施方案
2014/05/26 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
影视后期实训报告
2014/11/05 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
python随机打印成绩排名表
2021/06/23 Python
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL