一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Drupal中处理文件流File System和Stream Wrapper原理

时间:2015-06-11 编辑:简简单单 来源:一聚教程网

在Drupal7以及PHP(也不知那个版本)后,多了一个概念:Stream,主要用来表示文件流。BTW,追溯起Stream的概念,这个应该很早在Java和C#等OOP的语言中已存在,PHP只是简单的封装了file/file_get_content等函数,使用起来方便,所以PHPer 们更少的在意stream以及整个底层的操作。

当我们使用一个完整的框架(如:drupal框架),drupal又更加完善了PHP中stream的概念和使用方式,使其更加OO,更加易用。

注意:PHP本身是支持StreamWrapper的,Drupal只是对其进行完善,因此PHP的函数,如move、 fopen、move_uploaded_file等函数是直接可以用scheme的形式访问(类似php://的形式),在PHP中增加一个 streamwrapper需要注册一个,需要调用stream_wrapper_register函数。

详情参考: http://php.net/..class.streamwrapper.php

Stream是什么?

Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。跟Stream相连的就是存储,也就是Stream相当于一传输线,一端连接存储,一端连接程序。


File的操作

文件的操作基本就是读写,读写的位置其实就是stream,一般情况下读写本地文件,我们认为也是一个stream,可以认为 LocalFileStream,读写网络文件(FTP、HTTP、S3、阿里OSS、NFF等)也是一种stream,这样看来,文件的操作API其实应该是一个抽象的函数,而不是一个具体的函数。

数据库作为类比,数据的open、prepare、update、execute、close就是有一个抽象的类,后端用什么数据库,就有对应的实现,参考下面的图片:


db-abstract-layer-files

程序调用数据库的抽象接口,该接口根据数据库的url,按照不同的scheme返回不同的数据库操作类,完成对数据库的操作。

因此文件的操作,我们用数据库操作做对比,也可以用下图来表示:


file-abstract-layer

通过上图,我们就可以理解,其实对文件的操作就是对流的操作,不同的流对应不同的存储介质,只是默认情况下,我们认为流就是本地文件,但是随着存储的日益复杂和云的兴起,对文件的操作已不能简单的理解为对本地文件的操作,而应该是对流(Stream)的操作。

因此,在其他语言里面stream是一个基类,根据不同的存储介质,stream有不同的实现,比如C#中的stream的集成关系如下,通过OO的方式,更好的理解stream的概念。


C# Stream

Drupal中File API和Stream Wrapper

一图顶万言,综合上面的理解,我们做了下面这张关系图,虽然不一定准确,但是可以帮助我们理解Drupal中file和stream wrapper的关系。


drupal file system and  streamwrapper

Drupal的stream wrapper只是一个接口,可以实现任意的自定义stream wrapper。

Drupal的第三方stream wrapper:

Remote stream wrapper(http://、https://、feeds://)

https://www.drupal.org/project/remote_stream_wrapper

System stream wrapper (module://、theme://、profile://、library://)

https://www.drupal.org/project/system_stream_wrapper

因此,标准化的File操作,需要传进去一个带有scheme的path,在PHP中,默认的不带scheme就是本地文件。在Drupal中,默认的scheme是public,也是是本地文件的public目录。

StorageAPI 模块

Drupal中也许对上面的逻辑坐得不够完善,或许抽象层不是很完美,因此storageAPI模块出现了,它扩展的标准的Drupal文件操作,即使你对Drupal的file和stream不懂,装上这个模块,加上对应的service就能实现上图对云文件的操作。 如Amazon S3、Ftp、database等。

(笔者看来,StorageAPI就是对上面图中文件访问结构图中逻辑的实现和完善)

当然这个模块也有缺陷,那就是跟某些第三方模块的兼容的问题,并不是所有模块都能良好的兼容storage api模块,这个也是drupal第三方模块的同病。

注意,要启用drupal文件对storageAPI的支持,需要启用Core Bridge 模块。

StorageAPI模块参考 https://drupal.org/project/storage_api

Storage api stream wrapper :https://www.drupal.org/project/storage_api_stream_wrapper

后记

回顾第一段,PHP内部支持StreamWrapper,在Drupal中,对PHP的StreamWrapper进行了扩展,主要的Interface是:DrupalStreamWrapperInterface

Drupal本身通过这个Interface实现了DrupalLocalStreamWrapper,第三方模块实现了很多,如下:

HPCloud: HPCloudDrupalStreamWrapper

Storage API: StorageApiStreamWrapper

Storage Core Bridge: DrupalStorageStreamWrapper


热门栏目