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 一元分词算法
Nov 30 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
linux下编译安装memcached服务
Aug 03 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
symfony表单与页面实现技巧
Jan 26 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
PHP单例模式与工厂模式详解
Aug 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
js获取视频时长代码
2014/04/10 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
pycharm安装和首次使用教程
2018/08/27 Python
Python 3.8 新功能全解
2019/07/25 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
大学生毕业自我鉴定范文
2013/09/19 职场文书
实习生自我鉴定
2013/12/12 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
活动总结格式范文
2014/04/26 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
先进事迹材料范文
2014/12/29 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
《穷人》教学反思
2016/02/19 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
纯html+css实现Element loading效果
2021/08/02 HTML / CSS