首頁  >  文章  >  後端開發  >  PHP中流的基本知識

PHP中流的基本知識

墨辰丷
墨辰丷原創
2018-06-09 10:17:001449瀏覽

這篇文章主要介紹PHP中流的基本知識,有興趣的朋友參考下,希望對大家有幫助。

概述

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

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

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

流基礎

PHP中流的形式如:e8ecf1fabecb2bbf3952eba1f0f8a7ec://b4bef09dd2761803871f1d83e55d08b2。 e8ecf1fabecb2bbf3952eba1f0f8a7ec是包裝器的名字,b4bef09dd2761803871f1d83e55d08b2的內容取決於不同的包裝器語法。
預設的包裝器是file://,也就是說每次我們訪問檔案系統的時候都使用了流。例如,我們可以使用以下兩種方式來讀取檔案:readfile('/path/to/somefile.txt')和readfile('file:///path/to/somefile.txt'),使用這兩種方式讀取文件,可以得到相同的結果。

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

程式碼如下:

<?php
    var_dump(stream_get_transports());
    var_dump(stream_get_wrappers());
    var_dump(stream_get_filters());
?>

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

#程式碼如下:

array (size=8)
  0 => string &#39;tcp&#39; (length=3)
  1 => string &#39;udp&#39; (length=3)
  2 => string &#39;unix&#39; (length=4)
  3 => string &#39;udg&#39; (length=3)
  4 => string &#39;ssl&#39; (length=3)
  5 => string &#39;sslv3&#39; (length=5)
  6 => string &#39;sslv2&#39; (length=5)
  7 => string &#39;tls&#39; (length=3)
array (size=12)
  0 => string &#39;https&#39; (length=5)
  1 => string &#39;ftps&#39; (length=4)
  2 => string &#39;compress.zlib&#39; (length=13)
  3 => string &#39;compress.bzip2&#39; (length=14)
  4 => string &#39;php&#39; (length=3)
  5 => string &#39;file&#39; (length=4)
  6 => string &#39;glob&#39; (length=4)
  7 => string &#39;data&#39; (length=4)
  8 => string &#39;http&#39; (length=4)
  9 => string &#39;ftp&#39; (length=3)
  10 => string &#39;phar&#39; (length=4)
  11 => string &#39;zip&#39; (length=3)
array (size=12)
  0 => string &#39;zlib.*&#39; (length=6)
  1 => string &#39;bzip2.*&#39; (length=7)
  2 => string &#39;convert.iconv.*&#39; (length=15)
  3 => string &#39;string.rot13&#39; (length=12)
  4 => string &#39;string.toupper&#39; (length=14)
  5 => string &#39;string.tolower&#39; (length=14)
  6 => string &#39;string.strip_tags&#39; (length=17)
  7 => string &#39;convert.*&#39; (length=9)
  8 => string &#39;consumed&#39; (length=8)
  9 => string &#39;dechunk&#39; (length=7)
  10 => string &#39;mcrypt.*&#39; (length=8)
  11 => string &#39;mdecrypt.*&#39; (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,這是常用的場景。駭客在入侵網站的時候,也可能會用到這部分內容。

相關推薦:

使用Snoopy類別解析html檔案的方法

php針對檔案操作及字符串加密的方法

php針對字串操作的方法

以上是PHP中流的基本知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn