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实现登陆验证码(类似条行码状)
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
一个PHP模板,主要想体现一下思路
Dec 25 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
PHP 转义使用详解
Jul 15 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
PHP目录操作实例总结
Sep 27 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
php实现保存周期为1天的购物车类
Jul 07 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
PHP4.04简明安装
2006/10/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
公司财务自我评价分享
2013/12/17 职场文书
物业工作计划书
2014/01/10 职场文书
贫困证明怎么写
2015/06/16 职场文书
白银帝国观后感
2015/06/17 职场文书
详解Python为什么不用设计模式
2021/06/24 Python
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis