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使浏览器直接下载pdf文件的方法
Nov 15 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
WordPress伪静态规则设置代码实例
Dec 10 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/05/02 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
列表内容的选择
2006/06/30 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
python 对象和json互相转换方法
2018/03/22 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python中的函数作用域
2018/05/07 Python
如何给Python代码进行加密
2020/01/10 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
pygame实现弹球游戏
2020/04/14 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
Python内置函数及功能简介汇总
2020/10/13 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
圣诞节活动策划方案
2014/06/09 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
廉政承诺书
2015/01/19 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
小学数学教学反思范文
2016/02/16 职场文书