PHP 通過 php:// 封裝協議提供對各類輸入輸出流的統一訪問方式。這套機制不僅涵蓋標準輸入、輸出與錯誤流,還支援記憶體臨時存儲、文件描述符直接操作以及數據流過濾等進階功能,是 PHP 處理數據交互的核心基礎設施。
php://stdin、php://stdout 和 php://stderr 分別對應 PHP 進程的標準輸入、標準輸出和標準錯誤流。在 CLI 模式下,它們直接映射到終端設備;在 Web 環境中,stdin 可讀取原始請求體,stdout 則是輸出緩衝區的別名,stderr 常用於寫入錯誤日誌。
php://input 是一個唯讀流,用於獲取 HTTP 請求的原始數據(即未經解析的 POST 數據)。相比舊有的 $HTTP_RAW_POST_DATA,它不依賴 php.ini 中的 always_populate_raw_post_data 設置,且內存佔用更低,是處理 JSON、XML 等非表單數據的首選方式。
<form action="" method="post">
<input type="text" name="test"><input type="submit">
</form>
<?php
echo file_get_contents("php://input");
?>

php://output 是一個唯寫流,寫入方式與 print、echo 完全一致,數據會直接發送到輸出緩衝區。常用於生成文件下載、輸出圖片二進制數據等場景。
php://fd/N 允許直接操作文件描述符 N(如 php://fd/3)。這在進程間通信、繼承父進程打開的文件句柄時非常有用。
兩者都提供類文件的讀寫接口,差別在於存儲策略:
memory_limit。php://temp/maxmemory:1048576 調整)自動轉存到臨時文件,臨時文件路徑遵循 sys_get_temp_dir()。php://filter 是一個元封裝器,允許在打開流時掛載一個或多個過濾器。這對於 readfile()、file()、file_get_contents() 等無法在讀取前插入過濾邏輯的一體化函數極為關鍵。

<?php
readfile("php://filter/read=string.toupper/resource=https://www.phpcom.cn");
?>
此處 string.toupper 是內置字符串過濾器,更多過濾器請參考 PHP 手冊「流過濾器」章節。
php://input 獲取原始數據,再配合 json_decode() 解析。php://temp 避免記憶體耗盡。php://filter 實現流式加密、壓縮、編碼轉換,減少中間文件 I/O。