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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
PHP生成便于打印的网页
Oct 09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
简化php模板页面中分页代码的解析
Feb 06 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
destoon整合UCenter图文教程
Jun 21 PHP
PHP数组和explode函数示例总结
May 08 PHP
PHP 获取ip地址代码汇总
Jul 05 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 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 smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php实现数据库的增删改查
2017/02/26 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
js 字符串转化成数字的代码
2011/06/29 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
每天一篇javascript学习小结(RegExp对象)
2015/11/17 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
名片管理系统python版
2018/01/11 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python中is和==的区别详解
2018/11/15 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python音频处理的示例详解
2020/12/23 Python
python中pivot()函数基础知识点
2021/01/03 Python
python 对xml解析的示例
2021/02/27 Python
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
中班中秋节活动反思
2014/02/18 职场文书
社区党支部承诺书
2015/04/29 职场文书
比赛主持人开场白
2015/05/29 职场文书
单位更名证明
2015/06/18 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
nginx.conf配置文件结构小结
2022/04/08 Servers