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上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
一个经典的PHP验证码类分享
Nov 18 PHP
PHP中把对象转换为关联数组代码分享
Apr 09 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
php中bind_param()函数用法分析
Mar 28 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
PHP队列场景以及实现代码实例详解
Feb 26 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
jquery简单体验
2007/01/10 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
js实现select下拉框选择
2020/01/11 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
python 捕获shell脚本的输出结果实例
2017/01/04 Python
python中执行shell的两种方法总结
2017/01/10 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
会计专业自我鉴定范文
2013/10/06 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
诚实守信主题班会
2015/08/13 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js