首页 存档 技术 查看内容

PHP7使用资源包裹第三方扩展的实现及其源码解读

2018-3-30 13:00 |来自: 互联网 288 0

摘要: 在阅读下面的内容之前,我们假定你已经对PHP 7 基本的数据结构都有大致的了解了,这是下面内容阅读的前提。 我们分为两大块: 首先实现一个自定义的文件打开、读取、写入、关闭的文件操作扩展; 然后分析各个操作背 ...

在阅读下面的内容之前,我们假定你已经对PHP 7 基本的数据结构都有大致的了解了,这是下面内容阅读的前提。

我们分为两大块:

首先实现一个自定义的文件打开、读取、写入、关闭的文件操作扩展;

然后分析各个操作背后的实现原理,其中某些部分的实现我会和PHP 5.3 使用资源包裹第三方扩展源码解读对比分析。

0 通过原型生成扩展骨架

首先进入到源码目录的ext目录中,添加一个文件操作的原型文件

  1. [[email protected]]#cdext/

  2. [root@localhostext]#vimtipi_file.proto

编辑原型为

  1. resourcefile_open(stringfilename,stringmode)

  2. stringfile_read(resourcefilehandle,intsize)

  3. boolfile_write(resourcefilehandle,stringbuffer)

  4. boolfile_close(resourcefilehandle)

  1. [root@localhostext]#./ext_skel--extname=tipi_file--proto=./tipi_file.proto

这样一个简单的文件操作扩展的代码骨架就生成了。

完整代码tipi_file.c(https://github.com/zhoumengkang/notes/blob/master/php-extension/php7.0/tipi_file/tipi_file.c),可以先有一个大致的了解,这样后面阅读时,思路可能会清晰很多。

1 扩展的实现

1.1注册资源类型

1.1.1 注册资源 API

  1. ZEND_APIintzend_register_list_destructors_ex(rsrc_dtor_func_tld,rsrc_dtor_func_tpld,constchar*type_name,intmodule_number)

参数 解释
ld 释放该资源时调用的函数。
pld 释放用于在不同请求中始终存在的永久资源的函数。
type_name 是一个具有描述性类型名称的字符串。
module_number 为引擎内部使用,当我们调用这个函数时,我们只需要传递一个已经定义好的module_number变量。

该 API 返回一个资源类型 id,该id应当被作为全局变量保存在扩展里,以便在必要的时候传递给其他资源API。

1.1.2 添加资源释放回调函数

  1. staticvoidtipi_file_dtor(zend_resource*rsrcTSRMLS_DC){

  2. FILE*fp=(FILE*)rsrc-

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类