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
8个出色的WordPress SEO插件收集
Feb 26 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
smarty的section嵌套循环用法示例
May 28 PHP
php的socket编程详解
Nov 20 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
PHP错误和异长常处理总结
2014/03/06 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
ThinkPHP控制器详解
2015/07/27 PHP
Array对象方法参考
2006/10/03 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python原始套接字编程示例分享
2014/02/21 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Apache如何部署django项目
2017/05/21 Python
Python内置模块logging用法实例分析
2018/02/12 Python
对pandas中apply函数的用法详解
2018/04/10 Python
python读取和保存视频文件
2018/04/16 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
如何写你的创业计划书
2014/01/07 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
出生证明公证书
2014/04/09 职场文书
离婚协议书格式范本
2016/03/18 职场文书
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python