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中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php常用Stream函数集介绍
Jun 24 PHP
php中curl和file_get_content的区别
May 10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
YII中assets的使用示例
Jul 31 PHP
php获取错误信息的方法
Jul 17 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
Zend Framework动作助手Url用法详解
Mar 05 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
Chrome Web App开发小结
2014/09/04 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
javascript Object与Function使用
2010/01/11 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
实例解析Array和String方法
2016/12/14 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
基于Python解密仿射密码
2019/10/21 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
建筑专业毕业生推荐信
2013/11/21 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
2015年公司工作总结
2015/04/25 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技