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 相关文章推荐
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
PHP中的类型约束介绍
May 11 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
Oct 14 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
PHP命令空间namespace及use的用法小结
Nov 27 PHP
PDO::query讲解
Jan 29 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
初学Python实用技巧两则
2014/08/29 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
七年级音乐教学反思
2014/01/26 职场文书
就业自我评价
2014/02/04 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
java基础——多线程
2021/07/03 Java/Android