PHP7扩展开发之hello word实现方法详解


Posted in PHP onJanuary 15, 2018

本文实例讲述了PHP7扩展开发之hello word实现方法。分享给大家供大家参考,具体如下:

这里是以PHP7作为基础,讲解如何从零开始创建一个PHP扩展。本文主要讲解创建一个扩展的基本步骤都有哪些。示例中,我们将实现如下功能:

<?php
echo say();
?>

输出内容:

$ php ./test.php
$ hello word

在扩展中实现一个say方法,调用say方法后,输出 hello word。

第一步:生成代码

PHP为我们提供了生成基本代码的工具 ext_skel。这个工具在PHP源代码的./ext目录下。

$ cd php_src/ext/
$ ./ext_skel --extname=say

extname参数的值就是扩展名称。执行ext_skel命令后,这样在当前目录下会生成一个与扩展名一样的目录。

第二步,修改config.m4配置文件

config.m4的作用就是配合phpize工具生成configure文件。configure文件是用于环境检测的。检测扩展编译运行所需的环境是否满足。现在我们开始修改config.m4文件。

$ cd ./say
$ vim ./config.m4

打开,config.m4文件后,你会发现这样一段文字。

dnl If your extension references something external, use with:
dnl PHP_ARG_WITH(say, for say support,
dnl Make sure that the comment is aligned:
dnl [ --with-say       Include say support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(say, whether to enable say support,
dnl Make sure that the comment is aligned:
dnl [ --enable-say      Enable say support])

其中,dnl 是注释符号。上面的代码说,如果你所编写的扩展如果依赖其它的扩展或者lib库,需要去掉PHP_ARG_WITH相关代码的注释。否则,去掉 PHP_ARG_ENABLE 相关代码段的注释。我们编写的扩展不需要依赖其他的扩展和lib库。因此,我们去掉PHP_ARG_ENABLE前面的注释。去掉注释后的代码如下:

dnl If your extension references something external, use with:
 dnl PHP_ARG_WITH(say, for say support,
 dnl Make sure that the comment is aligned:
 dnl [ --with-say       Include say support])
 dnl Otherwise use enable:
 PHP_ARG_ENABLE(say, whether to enable say support,
 Make sure that the comment is aligned:
 [ --enable-say      Enable say support])

第三步,代码实现

修改say.c文件。实现say方法。
找到PHP_FUNCTION(confirm_say_compiled),在其上面增加如下代码:

PHP_FUNCTION(say)
{
    zend_string *strg;
    strg = strpprintf(0, "hello word");
    RETURN_STR(strg);
}

找到 PHP_FE(confirm_say_compiled, 在上面增加如下代码:

PHP_FE(say, NULL)

修改后的代码如下:

const zend_function_entry say_functions[] = {
   PHP_FE(say, NULL)    /* For testing, remove later. */
   PHP_FE(confirm_say_compiled,  NULL)    /* For testing, remove later. */
   PHP_FE_END /* Must be the last line in say_functions[] */
 };
 /* }}} */

第四步,编译安装

编译扩展的步骤如下:

$ phpize
$ ./configure
$ make && make install

修改php.ini文件,增加如下代码:

[say]
extension = say.so

然后执行,php -m 命令。在输出的内容中,你会看到say字样。

第五步,调用测试

自己写一个脚本,调用say方法。看输出的内容是否符合预期。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一周让你学会PHP 不错的学习资料
Feb 06 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
php中异常处理方法小结
Jan 09 PHP
php通过array_shift()函数移除数组第一个元素的方法
Mar 18 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 #PHP
详解PHP序列化和反序列化原理
Jan 15 #PHP
PHP使用两个栈实现队列功能的方法
Jan 15 #PHP
php获取ajax的headers方法与内容实例
Dec 27 #PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 #PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 #PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 #PHP
You might like
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
什么是JavaScript
2009/08/13 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
如何利用Python识别图片中的文字
2020/05/31 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python em算法的实现
2020/10/03 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
汇科协同Java笔试题
2012/03/31 面试题
小学生寒假家长评语
2014/04/16 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
服务整改报告
2014/11/06 职场文书
你会写请假条吗?
2019/06/26 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书