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