PHP7扩展开发教程之Hello World实现方法示例


Posted in PHP onAugust 03, 2017

本文实例讲述了PHP7扩展开发教程之Hello World实现方法。分享给大家供大家参考,具体如下:

一、下载PHP源代码

要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。

我下载了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz。

解压源码压缩包, tar xzf php-7.0.2.tar.gz,我们现在只需要关注Zend和ext这两个目录。

Zend目录里面包含了PHP的Zend Engine源代码,有些函数和宏的定义我们需要在这里面简单地看一下。

ext目录里面包含了PHP原生的扩展,以及我们开发自己的扩展时可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php

二、使用ext_skel工具

我们可以在ext目录下看到所有的PHP原生扩展,其中包括了熟悉的curl,json,mbstring,simplexml,sockets等扩展,还有很多没有用过甚至没有听说过的扩展,不用在意这些,我们先打开我们最熟悉的curl来看看,有config.m4配置文件,有php_curl.h,curl_file.c等源代码,还有一些中间文件,最后还有一个tests目录,里面放的curl扩展的单元测试。重点关注config.m4,php_curl.h,curl_file.c即可,最简单的场景下这三个文件就是一个扩展的全部组成部分了。

打开随便看一下,不算太复杂,但是自己写一个类似的还是挺头疼的,这时就需要用到我前面提到的ext_skel工具了。这个工具也在ext目录下,我们执行一下,./ext_skel --help,可以看到若干参数,我们用到的只有--extname=module,这里填上自己开发的扩展名称。想深入了解各个参数的作用可以看这里:http://php.net/manual/en/internals2.buildsys.skeleton.php

./ext_skel --extname=hello

ext目录下多了一个hello目录,我们后续的工作都在这个目录下面,工具已经为我们自动生成了一些文件。

config.m4配置文件

开发PHP扩展,在写C代码之前,要先配置一下这里。我们打开可以看到详细的注释说明,dnl是注释语法。

如果你的扩展用到了外部依赖,就配置--with-hello选项,否则配置--enable-hello选项,删除这下面3行的del注释

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[ --enable-hello      Enable hello support])

PHP_ARG_WITH和PHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要外部依赖的

配置好的内容,在后面执行configure --help时可以看到。

php_hello.h头文件

类似于C语音的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动

hello.c代码文件

真正的逻辑代码都在这个文件中,后面会详细介绍。

三、编写代码

好了,到这一步我们终于要开始写代码了,打开hello.c文件。

整个扩展的入口是zend_module_entry这个结构,具体的定义可以在Zend目录下的zend_modules.h文件中看到,一共有十几个属性,快速跳过,我们暂时只需要"hello world"。

zend_module_entry hello_module_entry = {
  STANDARD_MODULE_HEADER,
  "hello",
  hello_functions,
  PHP_MINIT(hello),
  PHP_MSHUTDOWN(hello),
  PHP_RINIT(hello),    /* Replace with NULL if there's nothing to do at request start */
  PHP_RSHUTDOWN(hello),  /* Replace with NULL if there's nothing to do at request end */
  PHP_MINFO(hello),
  PHP_HELLO_VERSION,
  STANDARD_MODULE_PROPERTIES
};

STANDARD_MODULE_HEADER帮我们实现了前面6个属性

"hello"是扩展的名字

hello_functions是扩展包含的全部方法的集合

后面5个宏分别代表5个扩展特定方法

PHP_HELLO_VERSION是扩展的版本号,定义在头文件中

STANDARD_MODULE_PROPERTIES帮我们实现了剩下的属性

暂时都不需要修改,知道这是一个入口就行。顺着这个入口,我们继续看怎么给扩展添加方法,在hello_functions[]方法数组中已经有了一个示例方法confirm_hello_compiled,我们参考它写我们的方法hello_world

const zend_function_entry hello_functions[] = {
  PHP_FE(confirm_hello_compiled, NULL)    /* For testing, remove later. */
  PHP_FE(hello_world, NULL)
  PHP_FE_END /* Must be the last line in hello_functions[] */
};

先在扩展的方法数组中添加上hello_world,然后再定义hello_world。找到confirm_hello_compiled方法定义的地方,在它下面依葫芦画瓢,php_printf是Zend Engine中的printf方法。

PHP_FUNCTION(hello_world)
{
  php_printf("Hello World!\n");
  RETURN_TRUE;
}

四、编译安装

最后就是编译安装我们的扩展了,安装过PHP扩展的同学不用看,没有经验的可以参考一下。

phpize

./configure
make
make install

现在PHP的扩展目录中已经有了hello.so这个文件,在php.ini中添加上扩展的配置

extension = hello.so

五、测试

写一个test.php方法,执行脚本就可以看到"Hello World!"

<?php
hello_world();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
php 中include()与require()的对比
Oct 09 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
PHP之uniqid()函数用法
Nov 03 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
php实现的数组转xml案例分析
Sep 28 PHP
Laravel框架自定义分页样式操作示例
Jan 26 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 #PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 #PHP
使用PHP json_decode可能遇到的坑与解决方法
Aug 03 #PHP
Yii 2中的load()和save()示例详解
Aug 03 #PHP
Yii2使用表单上传文件的实例代码
Aug 03 #PHP
yii2学习教程之5种内置行为类详解
Aug 03 #PHP
PHP实现的简单在线计算器功能示例
Aug 02 #PHP
You might like
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
PHP中SESSION过期设置
2021/03/09 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
vue vant Area组件使用详解
2019/12/09 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Django中几种重定向方法
2015/04/28 Python
Python装饰器基础详解
2016/03/09 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Django异步任务线程池实现原理
2019/12/17 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
安全员岗位职责
2015/02/10 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
Python标准库pathlib操作目录和文件
2021/11/20 Python
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫