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来检测proxy
Oct 09 PHP
图书管理程序(二)
Oct 09 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
php不写闭合标签的好处
Mar 04 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
thinkphp的dump函数无输出实例代码
Nov 15 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
PHP实现的AES 128位加密算法示例
Sep 16 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
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
纯JS实现轮播图
2017/02/22 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
基于node.js实现爬虫的讲解
2019/02/18 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
浅析Python中的序列化存储的方法
2015/04/28 Python
详解django三种文件下载方式
2018/04/06 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python如何实现的二分查找算法
2020/05/27 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
《满井游记》教学反思
2014/02/26 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
实习计划书范文
2015/01/16 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
python实现Nao机器人的单目测距
2021/09/04 Python
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android