Streams 是PHP提供的一個強有力的工具,我們常常在不經意會使用到它,如果善加利用將大大提高PHP的生產力。 駕馭Streams的強大力量後,應用程式將提升到一個新的高度。
下面是PHP手冊中對Streams的一段描述:
Streams 是在PHP 4.3.0版本被引入的,它被用於統一檔案、網路、資料壓縮等類檔案的操作方式,為這些類檔案操作提供了一組通用的函數介面。簡而言之,一個stream就是一個具有流式行為的資來源物件。也就是說,我們可以用線性方式來對stream進行讀取和寫入。並且可以用使用fseek()來跳轉到stream內的任意位置。
每個Streams對象都有一個封裝類,在封裝中可以添加處理特殊協議和編碼的相關代碼。PHP中已經內建了一些常用的封裝類,我們也可以建立和註冊自訂的封裝類。我們甚至能夠使用現有的context和filter對封裝類進行修改和增強。
Stream 基礎知識
Stream 可以通過://方式來引用。其中是封裝類的名字,中的內容是由封裝類的文法指定,不同的封裝類的文法會有所不同。
PHP預設的封裝類是file://,也就是說我們在訪問檔案系統的時候,其實就是在使用一個stream。我們可以通過下面兩種方式來讀取檔案中的內容,readfile('/path/to/somefile.txt')或者readfile('file:///path/to/somefile.txt'),這兩種方式是等效的。如果你是使用readfile('http://google.com/'),那麼PHP會選取HTTP stream封裝類來進行操作。
正如上文所述,PHP提供了不少內建的包轉類,protocol以及filter。 按照下文所述的方式,可以查詢到本機所支援的封裝類:
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());
在我機器上的輸出結果為:
Array
(
[0] => tcp
[1] => udp
[2] => unix
[3] => udg
[4] => ssl
[5] => sslv3
[6] => sslv2
[7] => tls
)
Array
(
[0] => https
[1] => ftps
[2] => compress.zlib
[3] => compress.bzip2
[4] => php
[5] => file
[6] => glob
[7] => data
[8] => http
[9] => ftp
[10] => zip
[11] => phar
)
Array
(
[0] => zlib.*
[1] => bzip2.*
[2] => convert.iconv.*
[3] => string.rot13
[4] => string.toupper
[5] => string.tolower
[6] => string.strip_tags
[7] => convert.*
[8] => consumed
[9] => dechunk
[10] => mcrypt.*
[11] => mdecrypt.*
)
提供的功能非常多,看上去還不錯吧?