2024 日本 PHP 研討會

php://

php://存取各種 I/O 資料流

說明

PHP 提供許多不同的 I/O 資料流,允許存取 PHP 自身的輸入和輸出資料流、標準輸入、輸出和錯誤檔案描述符、記憶體和磁碟支援的暫存檔案資料流,以及可在讀取和寫入其他檔案資源時操作它們的篩選器。

php://stdin、php://stdout 和 php://stderr

php://stdinphp://stdoutphp://stderr 允許直接存取對應 PHP 程序的輸入或輸出串流。此串流參考一個複製的檔案描述符,因此如果您開啟 php://stdin 並稍後關閉它,您只會關閉您複製的描述符 — STDIN 所參考的實際串流不受影響。建議您直接使用常數 STDINSTDOUTSTDERR,而不是使用這些包裝器手動開啟串流。

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

php://input

php://input 是一個唯讀串流,允許您從請求主體讀取原始數據。如果啟用了 enable_post_data_reading 選項,則在 enctype="multipart/form-data" 的 POST 請求中無法使用 php://input

php://output

php://output 是一個唯寫串流,允許您以與 printecho 相同的方式寫入輸出緩衝機制。

php://fd

php://fd 允許直接存取指定的檔案描述符。例如,php://fd/3 指的是檔案描述符 3。

php://memory 和 php://temp

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

php://filter 是一種元包裝器,旨在允許在開啟串流時對其應用 篩選器。這對於一體式檔案函數(例如 readfile()file()file_get_contents())非常有用,否則在讀取內容之前沒有機會對串流應用篩選器。

php://filter 目標將以下參數作為其路徑的一部分。可以在一個路徑上指定多個篩選器鏈。有關使用這些參數的具體資訊,請參閱範例。

php://filter 參數
名稱 說明
resource=<要篩選的串流> 這個參數是必需的。它指定您想要過濾的串流。
read=<套用至讀取鏈的過濾器列表> 這個參數是選用的。可以在這裡提供一個或多個過濾器名稱,以管道符號 (|) 分隔。
write=<套用至寫入鏈的過濾器列表> 這個參數是選用的。可以在這裡提供一個或多個過濾器名稱,以管道符號 (|) 分隔。
<套用至兩個鏈的過濾器列表> 任何沒有以 read=write= 為前綴的過濾器列表將會適當地套用至讀取和寫入鏈。

選項

包裝器摘要(對於 php://filter,請參考被過濾的包裝器的摘要)
屬性 支援
allow_url_fopen 限制
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 支援 fstat()
支援 unlink()
支援 rename()
支援 mkdir()
支援 rmdir()
支援 stream_select() 僅限 php://stdinphp://stdoutphp://stderrphp://fdphp://temp

範例

範例 #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://memoryphp://temp 不可重複使用,也就是說,在串流關閉後,就無法再次引用它們。

<?php
file_put_contents
('php://memory', 'PHP');
echo
file_get_contents('php://memory'); // 沒有任何輸出
新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top