| 特性 | $_POST | php://input |
|---|---|---|
| 數據格式 | 關聯數組(鍵值對) | 原始字符串(Raw Data) |
| Content-Type 支持 | application/x-www-form-urlencoded multipart/form-data | 所有類型 除 multipart/form-data |
| 處理過程 | 自動 urldecode、編碼轉換 | 無任何處理,直接讀取輸入流 |
| 內存佔用 | 較高(解析後數組) | 較低(流式讀取) |
| php.ini 依賴 | 無 | 無(不需 always_populate_raw_post_data) |
| 可讀取 $_GET | 否 | 否(GET 數據在 URL Query String,不在 Body) |
<!-- HTML -->
<form action="post.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>
post.php 使用 $_POST:
<?php
print_r($_POST);
// Array ( [user] => admin [password] => 123456 )
post.php 使用 php://input:
<?php
echo file_get_contents("php://input");
// user=admin&password=123456
前端發送 Content-Type: application/json,Body 為 {"uid":1001,"token":"abc"}。
<?php
// $_POST 為空數組!
var_dump($_POST); // array(0) { }
// php://input 可獲取原始 JSON
$json = file_get_contents("php://input");
$data = json_decode($json, true);
print_r($data); // Array ( [uid] => 1001 [token] => abc )
早期 PHP 使用 $HTTP_RAW_POST_DATA 獲取原始數據,但需在 php.ini 開啟 always_populate_raw_post_data = On,且不支持 multipart/form-data。PHP 5.6 棄用,7.0 移除。php://input 是現代替代方案。
PHP 只會自動解析 application/x-www-form-urlencoded 和 multipart/form-data 類型的請求體填充 $_POST。其他類型(JSON、XML、純文本)需自行從 php://input 讀取解析。
文件上傳使用 multipart/form-data,PHP 會自動解析並填充 $_POST(字段)和 $_FILES(文件)。php://input 無法讀取此類型,嘗試讀取將返回空字符串。
$_POST,代碼簡潔。file_get_contents('php://input') 獲取原始數據,再 json_decode 或 simplexml_load_string 解析。fopen('php://input', 'r') 分塊讀取,避免一次性載入大內存。php://input 在 PHP 4.3+ 可用,無需額外配置。$_POST 是針對標準表單的高級封裝,php://input 是通用的底層輸入流。理解二者的適用邊界,是構建健壯 PHP 應用(特別是 API 服務)的基礎。