php:// — 存取各種 I/O 資料流
PHP 提供許多不同的 I/O 資料流,允許存取 PHP 自身的輸入和輸出資料流、標準輸入、輸出和錯誤檔案描述符、記憶體和磁碟支援的暫存檔案資料流,以及可在讀取和寫入其他檔案資源時操作它們的篩選器。
php://stdin、php://stdout 和 php://stderr 允許直接存取對應 PHP 程序的輸入或輸出串流。此串流參考一個複製的檔案描述符,因此如果您開啟 php://stdin 並稍後關閉它,您只會關閉您複製的描述符 — STDIN
所參考的實際串流不受影響。建議您直接使用常數 STDIN
、STDOUT
和 STDERR
,而不是使用這些包裝器手動開啟串流。
php://stdin 是唯讀的,而 php://stdout 和 php://stderr 是唯寫的。
php://input 是一個唯讀串流,允許您從請求主體讀取原始數據。如果啟用了 enable_post_data_reading 選項,則在 enctype="multipart/form-data"
的 POST 請求中無法使用 php://input。
php://fd 允許直接存取指定的檔案描述符。例如,php://fd/3 指的是檔案描述符 3。
php://memory 和 php://temp 是可讀寫的串流,允許將臨時數據儲存在類似檔案的包裝器中。兩者之間的一個區別是 php://memory 會始終將其數據儲存在記憶體中,而 php://temp 在儲存的數據量達到預定義限制(預設為 2 MB)後會使用臨時檔案。此臨時檔案的位置的決定方式與 sys_get_temp_dir() 函數相同。
php://temp 的記憶體限制可以透過附加 /maxmemory:NN
來控制,其中 NN
是在使用臨時檔案之前要保留在記憶體中的最大數據量,以位元組為單位。
某些 PHP 擴充功能可能需要標準 IO 串流,並可能嘗試將指定的串流轉換為標準 IO 串流。此轉換對於記憶體串流可能會失敗,因為它需要 C fopencookie() 函數可用。此 C 函數在 Windows 上*不*可用。
php://filter 是一種元包裝器,旨在允許在開啟串流時對其應用 篩選器。這對於一體式檔案函數(例如 readfile()、file() 和 file_get_contents())非常有用,否則在讀取內容之前沒有機會對串流應用篩選器。
php://filter 目標將以下參數作為其路徑的一部分。可以在一個路徑上指定多個篩選器鏈。有關使用這些參數的具體資訊,請參閱範例。
名稱 | 說明 |
---|---|
resource=<要篩選的串流>
|
這個參數是必需的。它指定您想要過濾的串流。 |
read=<套用至讀取鏈的過濾器列表>
|
這個參數是選用的。可以在這裡提供一個或多個過濾器名稱,以管道符號 (| ) 分隔。 |
write=<套用至寫入鏈的過濾器列表>
|
這個參數是選用的。可以在這裡提供一個或多個過濾器名稱,以管道符號 (| ) 分隔。 |
<套用至兩個鏈的過濾器列表>
|
任何沒有以 read= 或 write= 為前綴的過濾器列表將會適當地套用至讀取和寫入鏈。 |
範例 #1 php://temp/maxmemory
這個選用參數允許在 php://temp 開始使用暫存檔之前設定記憶體限制。
<?php
// 設定限制為 5 MB。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// 讀取我們寫入的內容。
rewind($fp);
echo stream_get_contents($fp);
?>
範例 #2 php://filter/resource=<要過濾的串流>
這個參數必須位於 php://filter 規格的末尾,並且應該指向您要過濾的串流。
<?php
/* 這等同於:
readfile("http://www.example.com");
因為實際上沒有指定任何過濾器 */
readfile("php://filter/resource=http://www.example.com");
?>
範例 #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");
?>
範例 #4 php://filter/write=<套用至寫入鏈的過濾器列表>
此參數接受以管道符號 |
分隔的一個或多個過濾器名稱。
<?php
/* 這會將字串「Hello World」
通過 rot13 過濾器,然後寫入到
目前目錄中的 example.txt */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
範例 #5 php://memory 和 php://temp 不可重複使用
php://memory 和 php://temp 不可重複使用,也就是說,在串流關閉後,就無法再次引用它們。
<?php
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 沒有任何輸出