php://input 允許讀取原始 POST 數據。比 $HTTP_RAW_POST_DATA 更節省內存,無需特殊 php.ini 設置。不可用於 enctype=multipart/form-data。
| Content-Type | $_POST | php://input | $HTTP_RAW_POST_DATA |
|---|---|---|---|
| application/x-www-form-urlencoded | ✅ 解析後數組 | ✅ 原始字串 | ✅ 原始字串(需啟用 always_populate_raw_post_data) |
| multipart/form-data (文件上傳) | ✅ 解析後數組 | ❌ 空 | ❌ 空 |
| text/xml, application/json 等其他 | ❌ 空數組 | ✅ 原始字串 | ✅ 原始字串(需啟用) |
| GET 請求 | N/A (用 $_GET) | ❌ 空(實體體為空) | ❌ 空 |
<?php
// server.php
$raw = file_get_contents('php://input');
echo "---- \$_POST ----\n"; var_dump($_POST);
echo "---- php://input ----\n"; var_dump($raw);
echo "---- \$HTTP_RAW_POST_DATA ----\n"; var_dump($GLOBALS['HTTP_RAW_POST_DATA'] ?? '未啟用');
?>
POST /server.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=test&age=25
結果:$_POST 為 ['name'=>'test','age'=>'25'],php://input 為 "name=test&age=25",兩者內容一致(格式不同)。
POST /server.php HTTP/1.1
Content-Type: application/json
Content-Length: 28
{"action":"login","user":"abc"}
結果:$_POST 為 [],php://input 為原始 JSON 字串。這是讀取非表單 POST 數據的標準方式。
php://input 返回空字串,必須使用 $_POST、$_FILES。
查詢字串在 URL 中,HTTP 實體體為空,php://input 讀不到任何內容。
php://input:流式讀取,佔用內存小,無需配置,推薦。$HTTP_RAW_POST_DATA:需 always_populate_raw_post_data = On(PHP 5.6 棄用,PHP 7.0 移除),佔用內存大。$fp = fopen('php://input', 'r');
while (!feof($fp)) {
$chunk = fread($fp, 8192);
// 處理 chunk,如寫入文件、流式解析 JSON
}
fclose($fp);
$ctx = stream_context_create(['http' => ['max_redirects' => 0]]);
$data = file_get_contents('php://input', false, $ctx);
$_GET。$_FILES,不暴露給輸入流。$GLOBALS['HTTP_RAW_POST_DATA'] 訪問,且已移除。$data = json_decode(file_get_contents('php://input'), true);php://input,回退 $HTTP_RAW_POST_DATA(極少見)。$_FILES + move_uploaded_file(),勿嘗試 php://input。Content-Type、限制 Content-Length、防止惡意大請求佔用內存。