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 相关文章推荐
如何删除多级目录
Oct 09 PHP
PHP控制网页过期时间的代码
Sep 28 PHP
PHP中的函数嵌套层数限制分析
Jun 13 PHP
linux iconv方法的使用
Oct 01 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
php的优点总结 php有哪些优点
Jul 19 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
Python文件处理
2016/02/29 Python
Python解决八皇后问题示例
2018/04/22 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
pycharm 安装JPype的教程
2019/08/08 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python中def是做什么的
2020/06/10 Python
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
园林毕业生自我鉴定范文
2013/12/29 职场文书
优秀医生事迹材料
2014/02/12 职场文书
2015年路政工作总结
2015/05/22 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
Python if else条件语句形式详解
2022/03/24 Python
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers