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