主頁 > Drupal > File System和Stream Wrapper的原理介紹

File System和Stream Wrapper的原理介紹

PDF版本

在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

本文對Drupal的file操作還沒有完全描述清楚,后續給大家講解Drupal的File管理。
更多問題,請訪問Drupal大學,解答各種Drupal的疑難問題。http://drupal001.net

存儲相關博文:
使用GlusterFS做為Drupal文件存儲的云服務
漫談企業級Drupal架構應用與部署


聲明: 本站所有文章歡迎轉載,所有文章未說明,均屬于原創,轉載均請注明出處。
本文有效鏈接: http://www.vczhtn.live/2015/05/file-system-stream-wrapper/
版權所有: Drupal與高性能網站架構 http://www.vczhtn.live


, ,

發表評論

電子郵件地址不會被公開。 必填項已用 * 標注


+ 4 = 六

您可以使用這些 HTML 標簽和屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的鏈接
File System和Stream Wrapper的原理介紹 來自 Drupal與高性能網站架構
頂部
安徽福彩15选5走势图