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在线打包程序源码
Jul 27 PHP
PHP编程函数安全篇
Jan 08 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 PHP
php处理json格式数据经典案例总结
May 19 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 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版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
JS远程获取网页源代码实例
2013/09/05 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python实现批量压缩图片
2018/01/25 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
Python发展史及网络爬虫
2019/06/19 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python中return的返回和执行实例
2019/12/24 Python
python 等差数列末项计算方式
2020/05/03 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
公务员总结性个人自我评价
2013/12/05 职场文书
应届生求职信
2014/05/31 职场文书
司法局火灾防控方案
2014/06/05 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2014年小学校长工作总结
2014/12/08 职场文书