php://

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

說明

PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。

php://stdin, php://stdout 和 php://stderr

php://stdinphp://stdoutphp://stderr 允許直接訪問 PHP 進程相應的輸入或者輸出流。 數據流引用了復制的文件描述符,所以如果你打開 php://stdin 并在之后關了它, 僅是關閉了復制品,真正被引用的 STDIN 并不受影響。 注意 PHP 在這方面的行為有很多 BUG 直到 PHP 5.2.1。 推薦你簡單使用常量 STDINSTDOUTSTDERR 來代替手工打開這些封裝器。

php://stdin 是只讀的, php://stdoutphp://stderr 是只寫的。

php://input

php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴于特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內存。 enctype="multipart/form-data" 的時候 php://input 是無效的。

Note: 在 PHP 5.6 之前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操作。 不過,依賴于 SAPI 的實現,請求體數據被保存的時候, 它可以打開另一個 php://input 數據流并重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。

php://output

php://output 是一個只寫的數據流, 允許你以 printecho 一樣的方式 寫入到輸出緩沖區。

php://fd

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

php://memory 和 php://temp

php://memoryphp://temp 是一個類似文件 包裝器的數據流,允許讀寫臨時數據。 兩者的唯一區別是 php://memory 總是把數據儲存在內存中, 而 php://temp 會在內存量達到預定義的限制后(默認是 2MB)存入臨時文件中。 臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。

php://temp 的內存限制可通過添加 /maxmemory:NN 來控制,NN 是以字節為單位、保留在內存的最大數據量,超過則使用臨時文件。

php://filter

php://filter 是一種元封裝器, 設計用于數據流打開時的篩選過濾應用。 這對于一體式(all-in-one)的文件函數非常有用,類似 readfile()file()file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。

php://filter 目標使用以下的參數作為它路徑的一部分。 復合過濾鏈能夠在一個路徑上指定。詳細使用這些參數可以參考具體范例。

php://filter 參數
名稱 描述
resource=<要過濾的數據流> 這個參數是必須的。它指定了你要篩選過濾的數據流。
read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
<;兩個鏈的篩選列表> 任何沒有以 read=write= 作前綴 的篩選器列表會視情況應用于讀或寫鏈。

可選項

封裝協議摘要(針對 php://filter,參考被篩選的封裝器。)
屬性 支持
受限于 allow_url_fopen No
受限于 allow_url_include php://inputphp://stdinphp://memoryphp://temp
允許讀取 php://stdinphp://inputphp://fdphp://memoryphp://temp
允許寫入 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp
允許追加 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp(等于寫入)
允許同時讀寫 php://fdphp://memoryphp://temp
支持 stat() php://memoryphp://temp
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No
僅僅支持 stream_select() php://stdinphp://stdoutphp://stderrphp://fdphp://temp

更新日志

版本 說明
5.6.0 php://input 可反復使用。
5.3.6 增加 php://fd
5.1.0 增加 php://memoryphp://temp
5.0.0 增加 php://filter

范例

Example #1 php://temp/maxmemory

這個可選選項允許設置 php://temp 開始使用臨時文件前的最大內存限制。

<?php
// Set the limit to 5 MB.
$fiveMBs 1024 1024;
$fp fopen("php://temp/maxmemory:$fiveMBs"'r+');

fputs($fp"hello\n");

// Read what we have written.
rewind($fp);
echo 
stream_get_contents($fp);
?>

Example #2 php://filter/resource=<待過濾的數據流>

這個參數必須位于 php://filter 的末尾,并且指向需要過濾篩選的數據流。

<?php
/* 這簡單等同于:
  readfile("http://www.example.com");
  實際上沒有指定過濾器 */

readfile("php://filter/resource=http://www.example.com");
?>

Example #3 php://filter/read=<讀鏈需要應用的過濾器列表>

這個參數采用一個或以管道符 | 分隔的多個過濾器名稱。

<?php
/* 這會以大寫字母輸出 www.example.com 的全部內容 */
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");
?>

Example #4 php://filter/write=<寫鏈需要應用的過濾器列表>

這個參數采用一個或以管道符 | 分隔的多個過濾器名稱。

<?php
/* 這會通過 rot13 過濾器篩選出字符 "Hello World"
  然后寫入當前目錄下的 example.txt */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>

Example #5 php://memory 和 php://temp 是一次性的

php://memoryphp://temp 是一次性的,比如:stream 流關閉后,就無法再次得到以前的內容了。

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 啥也沒有
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top 北京赛车pk开奖直播视频
炒股视频教程 台湾麻将怎么算翻 nba掘金vs热火 有坂深雪步兵 武汉小姐上门 足球指数比分 3d绝杀6码 3d近1000开奖 日本AV片做爱 美国股市行情 pk10精准稳定人 下載日本av电影 西安沐足店转让 工商管理硕士专业 手游麻将辅助有没有 簧色大片大全 a级片