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项目的方法
Oct 09 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
PHP快速推送微信模板消息
Apr 14 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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从字符串创建函数的方法
2015/03/16 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
HTML5的新特性(1)
2016/03/03 HTML / CSS
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
广告学专业自荐信范文
2014/02/24 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
1亿有多大教学反思
2014/05/01 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
团员个人年度总结
2015/02/26 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang