php:// — 訪(fǎng)問(wèn)各個(gè)輸入/輸出流(I/O streams)
PHP 提供了一些雜項輸入/輸出(IO)流,允許訪(fǎng)問(wèn) PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內存中、磁盤(pán)備份的臨時(shí)文件流以及可以操作其他讀取寫(xiě)入文件資源的過(guò)濾器。
php://stdin、php://stdout 和
php://stderr 允許直接訪(fǎng)問(wèn) PHP 進(jìn)程相應的輸入或者輸出流。
數據流引用了復制的文件描述符,所以如果你打開(kāi) php://stdin 并在之后關(guān)了它,
僅是關(guān)閉了復制品,真正被引用的 STDIN
并不受影響。
推薦你簡(jiǎn)單使用常量 STDIN
、
STDOUT
和 STDERR
來(lái)代替手工打開(kāi)這些封裝器。
php://stdin 是只讀的, php://stdout 和 php://stderr 是只寫(xiě)的。
php://input 是個(gè)可以訪(fǎng)問(wèn)請求的原始數據的只讀流。
enctype="multipart/form-data"
的時(shí)候
php://input 是無(wú)效的。
php://fd 允許直接訪(fǎng)問(wèn)指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。
php://memory 和 php://temp 是一個(gè)類(lèi)似文件 包裝器的數據流,允許讀寫(xiě)臨時(shí)數據。 兩者的唯一區別是 php://memory 總是把數據儲存在內存中, 而 php://temp 會(huì )在內存量達到預定義的限制后(默認是 2MB)存入臨時(shí)文件中。 臨時(shí)文件位置的決定和 sys_get_temp_dir() 的方式一致。
php://temp 的內存限制可通過(guò)添加 /maxmemory:NN
來(lái)控制,NN
是以字節為單位、保留在內存的最大數據量,超過(guò)則使用臨時(shí)文件。
php://filter 是一種元封裝器, 設計用于數據流打開(kāi)時(shí)的篩選過(guò)濾應用。 這對于一體式(all-in-one)的文件函數非常有用,類(lèi)似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒(méi)有機會(huì )應用其他過(guò)濾器。
php://filter 目標使用以下的參數作為它路徑的一部分。 復合過(guò)濾鏈能夠在一個(gè)路徑上指定。詳細使用這些參數可以參考具體范例。
名稱(chēng) | 描述 |
---|---|
resource=<要過(guò)濾的數據流>
|
這個(gè)參數是必須的。它指定了你要篩選過(guò)濾的數據流。 |
read=<讀鏈的篩選列表>
|
該參數可選??梢栽O定一個(gè)或多個(gè)過(guò)濾器名稱(chēng),以管道符(| )分隔。
|
write=<寫(xiě)鏈的篩選列表>
|
該參數可選??梢栽O定一個(gè)或多個(gè)過(guò)濾器名稱(chēng),以管道符(| )分隔。
|
<;兩個(gè)鏈的篩選列表>
|
任何沒(méi)有以 read= 或 write= 作前綴
的篩選器列表會(huì )視情況應用于讀或寫(xiě)鏈。
|
示例 #1 php://temp/maxmemory
這個(gè)可選選項允許設置 php://temp 開(kāi)始使用臨時(shí)文件前的最大內存限制。
<?php
// 限制內存為 5 MB。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// 讀取剛才寫(xiě)入的內容。
rewind($fp);
echo stream_get_contents($fp);
?>
示例 #2 php://filter/resource=<待過(guò)濾的數據流>
這個(gè)參數必須位于 php://filter 的末尾,并且指向需要過(guò)濾篩選的數據流。
<?php
/* 這簡(jiǎn)單等同于:
readfile("http://www.example.com");
實(shí)際上沒(méi)有指定過(guò)濾器 */
readfile("php://filter/resource=http://www.example.com");
?>
示例 #3 php://filter/read=<讀鏈需要應用的過(guò)濾器列表>
這個(gè)參數采用一個(gè)或以管道符 |
分隔的多個(gè)過(guò)濾器名稱(chēng)。
<?php
/* 這會(huì )以大寫(xiě)字母輸出 www.example.com 的全部?jì)热?nbsp;*/
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* 這會(huì )和以上所做的一樣,但還會(huì )用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
示例 #4 php://filter/write=<寫(xiě)鏈需要應用的過(guò)濾器列表>
這個(gè)參數采用一個(gè)或以管道符 |
分隔的多個(gè)過(guò)濾器名稱(chēng)。
<?php
/* 這會(huì )通過(guò) rot13 過(guò)濾器篩選出字符 "Hello World"
然后寫(xiě)入當前目錄下的 example.txt */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
示例 #5 php://memory 和 php://temp 是一次性的
php://memory 和 php://temp 是一次性的,比如:stream 流關(guān)閉后,就無(wú)法再次得到以前的內容了。
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 啥也沒(méi)有