《PHP應用:PHP中的流(streams)淺析》要點:
本文介紹了PHP應用:PHP中的流(streams)淺析,希望對您有用。如果有疑問,可以聯系我們。
PHP編程概述
PHP編程流(streams)是PHP4.3版本引入的一個特性,主要是為了統一文件、sockets以及其他類似資源的工作辦法.PHP4.3距今已經有很長時間了,但是很多程序員似乎都不能正確使用PHP中的流,當然這也包括我.以前也在一些程序中遇到過流的使用,如php://input,但是一直沒機會整理,今天就把這部分知識整理下.
PHP編程流是由PHP提供的資源,可以供我們透明的使用,并且流是一個非常強大的工具.適當的在程序中使用流,可以將我們的程序帶到一個新的高度.
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.
PHP編程每一種流都實現了一個包裝器(wrapper),包裝器包括一些額外的代碼用來處理特殊的協議和編碼.PHP提供了一些內置的包裝器,我們也可以很輕松的創建和注冊自定義的包裝器.我們甚至可以使用上下文(contexts)和過濾器來改變和增強包裝器.
PHP編程流基礎知識
PHP編程PHP中流的形式如:<scheme>://<target>.<scheme>是包裝器的名字,<target>的內容取決于不同的包裝器語法.
默認的包裝器是file://,也就是說每次我們拜訪文件系統的時候都使用了流.例如,我們可以使用如下兩種方式來讀取文件:readfile('/path/to/somefile.txt')和readfile('file:///path/to/somefile.txt'),使用這兩種方式讀取文件,可以得到相同的結果.
PHP編程正如前面所說,PHP提供了一些內置的包裝器、協議和過濾器.查看我們的機器上安裝了哪些包裝器,可以使用如下幾個函數:
代碼如下:
<?php
??? var_dump(stream_get_transports());
??? var_dump(stream_get_wrappers());
??? var_dump(stream_get_filters());
?>
PHP編程我當地的環境輸出內容如下:
代碼如下:
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編程php://包裝器
PHP編程PHP有它自己的訪問輸入/輸出(I/O)流的包裝器.PHP有基本的php://stdin,php://stdout,php://stderr包裝器對應默認的I/O資源.還有一個php://input流,它是一個只讀的流,流內容是post哀求的數據.當我們將數據放在一個post哀求的body體內用來哀求一個遠程服務的時候,這個流特別好用.
PHP編程因為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部分.
PHP編程流上下文(Stream Contexts)
PHP編程這部分內容在編程中幾乎沒有遇到過,本人研究起來也比擬吃力,大家感興趣的話可以自行百度.
PHP編程總結
PHP編程流在平時的編程中用到的并不是很多,在使用xml-rpc的時候,server端獲取client數據,主要是通過php輸入流input,這是一種常用的場景.黑客在入侵網站的時候,也可能會用到這部門內容.
《PHP應用:PHP中的流(streams)淺析》是否對您有啟發,歡迎查看更多與《PHP應用:PHP中的流(streams)淺析》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9990.html