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 EOT定界符的使用详解
Sep 30 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
php 数组的一个悲剧?
May 11 PHP
PHP程序员基本要求和必备技能
May 09 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
PHP常用的排序和查找算法
Aug 06 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP对象相关知识总结
Apr 09 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
PHP7新增函数
Mar 09 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实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
python 字符串split的用法分享
2013/03/23 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
详解python中init方法和随机数方法
2019/03/13 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
python提取log文件内容并画出图表
2019/07/08 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
接口的多继承会带来哪些问题
2015/08/17 面试题
办理护照介绍信
2014/01/16 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis