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框架codeigniter中如何使用框架的session
Jun 24 PHP
php 如何获取数组第一个值
Aug 06 PHP
php强制运行广告的方法
Dec 01 PHP
linux中cd命令使用详解
Jan 08 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 PHP
WordPress多语言翻译插件 - WPML使用教程
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
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP获取当前完整URL地址的函数
2014/12/21 PHP
简单谈谈php中的unicode和utf8编码
2015/06/10 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
Python实现的几个常用排序算法实例
2014/06/16 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
浅谈Python 递归算法指归
2019/08/22 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
python import 上级目录的导入
2020/11/03 Python
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
公司拓展活动方案
2014/02/13 职场文书
法人任命书范本
2014/06/04 职场文书
节约用水标语
2014/06/11 职场文书
音乐幼师求职信
2014/07/09 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
长城英文导游词
2015/01/30 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android