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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
php5.2时间相差8小时
Jan 15 PHP
PHP抽象类 介绍
Jun 13 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHP中数组的分组排序实例
Jun 01 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP数组常用函数实例小结
Aug 20 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
Laravel框架表单验证操作实例分析
Sep 30 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php强制下载类型的实现代码
2011/04/21 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
javascript操作css属性
2013/12/30 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
JS之相等操作符详解
2016/09/13 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
python九九乘法表的实例
2017/09/26 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
大学生见习期满自我鉴定
2014/09/13 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
python获取带有返回值的多线程
2022/05/02 Python
解决 redis 无法远程连接
2022/05/15 Redis