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验证码代码
Feb 27 PHP
破解.net程序(dll文件)编译和反编译方法
Jan 31 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
php生成静态页面的简单示例
Apr 17 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
Apr 24 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
Linux安装配置php环境的方法
Jan 14 PHP
PHP数组实例详解
Jun 26 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
NOT NULL 和NULL
2007/01/15 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
PHP基础学习小结
2011/04/17 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
python开发之for循环操作实例详解
2015/11/12 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python爬取淘宝商品销量信息
2018/11/16 Python
python实现五子棋小游戏
2020/03/25 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
小学教师师德师风演讲稿
2014/08/22 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
信访维稳承诺书
2015/05/04 职场文书