php://

php://訪問(wèn)各個(gè)輸入/輸出流(I/O streams)

說(shuō)明

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

php://stdin、php://stdoutphp://stderr 允許直接訪問(wèn) PHP 進(jìn)程相應(yīng)的輸入或者輸出流。 數(shù)據(jù)流引用了復(fù)制的文件描述符,所以如果你打開(kāi) php://stdin 并在之后關(guān)了它, 僅是關(guān)閉了復(fù)制品,真正被引用的 STDIN 并不受影響。 推薦你簡(jiǎn)單使用常量 STDIN、 STDOUTSTDERR 來(lái)代替手工打開(kāi)這些封裝器。

php://stdin 是只讀的, php://stdoutphp://stderr 是只寫(xiě)的。

php://input

php://input 是個(gè)可以訪問(wèn)請(qǐng)求的原始數(shù)據(jù)的只讀流。 enctype="multipart/form-data" 的時(shí)候 php://input 是無(wú)效的。

php://output

php://output 是一個(gè)只寫(xiě)的數(shù)據(jù)流, 允許你以 printecho 一樣的方式 寫(xiě)入到輸出緩沖區(qū)。

php://fd

php://fd 允許直接訪問(wèn)指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。

php://memory 和 php://temp

php://memoryphp://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

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ù)可以參考具體范例。

php://filter 參數(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ū)戞湣?

可選項(xiàng)

封裝協(xié)議摘要(針對(duì) php://filter,參考被篩選的封裝器。)
屬性 支持
受限于 allow_url_fopen No
受限于 allow_url_include php://inputphp://stdin、 php://memoryphp://temp。
允許讀取 php://stdin、 php://input、 php://fd、 php://memoryphp://temp。
允許寫(xiě)入 php://stdout、 php://stderr、 php://output、 php://fdphp://memoryphp://temp。
允許追加 php://stdout、 php://stderr、 php://output、 php://fd、 php://memoryphp://temp(等于寫(xiě)入)
允許同時(shí)讀寫(xiě) php://fdphp://memoryphp://temp。
支持 stat() 不支持。不過(guò),php://memoryphp://temp 支持 fstat()
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No
僅僅支持 stream_select() php://stdin、 php://stdout、 php://stderrphp://fdphp://temp。

范例

示例 #1 php://temp/maxmemory

這個(gè)可選選項(xiàng)允許設(shè)置 php://temp 開(kāi)始使用臨時(shí)文件前的最大內(nèi)存限制。

<?php
// 限制內(nèi)存為 5 MB。
$fiveMBs 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://memoryphp://temp 是一次性的,比如:stream 流關(guān)閉后,就無(wú)法再次得到以前的內(nèi)容了。

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 啥也沒(méi)有