PHP中的流(streams)淺析

來源:互聯網
上載者:User

   這篇文章主要介紹了PHP中的流(streams)淺析,本文講解了流的概述、流基礎知識、php://封裝器、流上下文(Stream Contexts)等內容,需要的朋友可以參考下

  概述

  流(streams)是PHP4.3版本引入的一個特性,主要是為了統一檔案、sockets以及其他類似資源的工作方法。PHP4.3距今已經有很長時間了,但是很多程式員似乎都不能正確使用PHP中的流,當然這也包括我。以前也在一些程式中遇到過流的使用,如php://input,但是一直沒機會整理,今天就把這部分知識整理下。

  流是由PHP提供的資源,可以供我們透明的使用,而且流是一個非常強大的工具。適當的在程式中使用流,可以將我們的程式帶到一個新的高度。

  PHP手冊中對流的描述如下:

  複製代碼 代碼如下:

  Streams were introduced with PHP 4.3.0 as a way of generalizing file, network, data compression, and other operations which share a common set of functions and uses. In its simplest definition, a stream is a resource object which exhibits streamable behavior. That is, it can be read from or written to in a linear fashion, and may be able to fseek() to an arbitrary locations within the stream.

  每一種流都實現了一個封裝器(wrapper),封裝器包含一些額外的代碼用來處理特殊的協議和編碼。PHP提供了一些內建的封裝器,我們也可以很輕鬆的建立和註冊自訂的封裝器。我們甚至可以使用上下文(contexts)和過濾器來改變和增強封裝器。

  流基礎知識

  PHP中流的形式如:://。是封裝器的名字,的內容取決於不同的封裝器文法。

  預設的封裝器是file://,也就是說每次我們訪問檔案系統的時候都使用了流。例如,我們可以使用如下兩種方式來讀取檔案:readfile('/path/to/somefile.txt')和readfile('file:///path/to/somefile.txt'),使用這兩種方式讀取檔案,可以得到相同的結果。

  正如前面所說,PHP提供了一些內建的封裝器、協議和過濾器。查看我們的機器上安裝了哪些封裝器,可以使用如下幾個函數:

  複製代碼 代碼如下:

  

  var_dump(stream_get_transports());

  var_dump(stream_get_wrappers());

  var_dump(stream_get_filters());

  ?>

  我本地的環境輸出內容如下:

  複製代碼 代碼如下:

  array (size=8)

  0 => string 'tcp' (length=3)

  1 => string 'udp' (length=3)

  2 => string 'unix' (length=4)

  3 => string 'udg' (length=3)

  4 => string 'ssl' (length=3)

  5 => string 'sslv3' (length=5)

  6 => string 'sslv2' (length=5)

  7 => string 'tls' (length=3)

  array (size=12)

  0 => string 'https' (length=5)

  1 => string 'ftps' (length=4)

  2 => string 'compress.zlib' (length=13)

  3 => string 'compress.bzip2' (length=14)

  4 => string 'php' (length=3)

  5 => string 'file' (length=4)

  6 => string 'glob' (length=4)

  7 => string 'data' (length=4)

  8 => string 'http' (length=4)

  9 => string 'ftp' (length=3)

  10 => string 'phar' (length=4)

  11 => string 'zip' (length=3)

  array (size=12)

  0 => string 'zlib.*' (length=6)

  1 => string 'bzip2.*' (length=7)

  2 => string 'convert.iconv.*' (length=15)

  3 => string 'string.rot13' (length=12)

  4 => string 'string.toupper' (length=14)

  5 => string 'string.tolower' (length=14)

  6 => string 'string.strip_tags' (length=17)

  7 => string 'convert.*' (length=9)

  8 => string 'consumed' (length=8)

  9 => string 'dechunk' (length=7)

  10 => string 'mcrypt.*' (length=8)

  11 => string 'mdecrypt.*' (length=10)

  另外,我們可以自訂或者使用第三方的流。

  php://封裝器

  PHP有它自己的訪問輸入/輸出(I/O)流的封裝器。PHP有基本的php://stdin,php://stdout,php://stderr封裝器對應預設的I/O資源。還有一個php://input流,它是一個唯讀流,流內容是post請求的資料。當我們將資料放在一個post請求的body體內用來請求一個遠程服務的時候,這個流特別好用。

  因為php://input是最常用到的流,所以這裡列出一些知識點:

  複製代碼 代碼如下:

  1.php://input可以讀取沒有處理過的POST資料。相較於$HTTP_RAW_POST_DATA而言,它給記憶體帶來的壓力較小,並且不需要特殊的php.ini設定。php://input不能用於enctype=multipart/form-data

  2.僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST資料與php://input資料才是”一致”(打上引號,表示它們格式不一致,內容一致)的。其它情況,它們都不一致

  3.php://input讀取不到GET資料。是因為_GET資料作為query_path寫在http要求標頭部(header)的PATH欄位,而不是寫在http請求的body部分。

  流上下文(Stream Contexts)

  這部分內容在編程中幾乎沒有遇到過,本人研究起來也比較吃力,大家感興趣的話可以自行百度。

  總結

  流在平時的編程中用到的並不是很多,在使用xml-rpc的時候,server端擷取client資料,主要是通過php輸入資料流input,這是一種常用的情境。駭客在入侵網站的時候,也可能會用到這部分內容。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.