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中break及continue两个流程控制指令区别分析
Apr 18 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 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更快的提供文件下载的代码
2012/06/13 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
opencv python图像梯度实例详解
2020/02/04 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
python实现连连看游戏
2020/02/14 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
学校门卫工作职责
2013/12/07 职场文书
教师自荐信
2013/12/10 职场文书
实习鉴定范文
2013/12/19 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
逃课上网检讨书
2014/02/20 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2014年营业员工作总结
2014/11/18 职场文书
特此通知格式
2015/04/27 职场文书
就业证明函
2015/06/17 职场文书