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 相关文章推荐
图书管理程序(一)
Oct 09 PHP
如何在PHP中进行身份认证
Oct 09 PHP
php下将XML转换为数组
Jan 01 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
PHP中header用法小结
May 23 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 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来计算某个目录大小的方法
2014/04/01 PHP
php中动态修改ini配置
2014/10/14 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
浅谈js中的闭包
2015/03/16 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
python ip正则式
2009/05/07 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
前台接待员岗位职责
2014/01/02 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
法人委托书范本格式
2014/09/15 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js