首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 接收 POST 數據的三種方式深度解析:$_POST、php://input、HTTP_RAW_POST_DATA

     編輯:PHP 相關知識

PHP 接收 POST 數據的三種方式深度解析

PHP 接收 POST 數據的方式取決於 Content-Type 與客戶端類型。本文系統對比 $_POST、php://input、$HTTP_RAW_POST_DATA 三大通道的適用場景、數據格式限制、內存影響與代碼實戰,助你精準選型。

通道對比總覽

通道適用 Content-Type數據結構內存影響PHP 版本狀態
$_POSTapplication/x-www-form-urlencoded
multipart/form-data
關聯陣列 (自動解析)低 (已解析)全版本穩定
php://input任意 (除 multipart/form-data)原始字符串流中 (按需讀取)全版本推薦
$HTTP_RAW_POST_DATA未識別 MIME 類型原始字符串 (自動填充)高 (始終填充)PHP 7.0 棄用, 8.0 移除

1. $_POST —— 表單提交標準通道

<?php
// 瀏覽器表單提交 / AJAX application/x-www-form-urlencoded
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
// 自動解析鍵值對,支援多維陣列 name="user[name]"
?>
  • 自動處理 URL 解碼、字符編碼轉換。
  • 不支援 application/json、text/xml、application/octet-stream 等非標準表單類型。

2. php://input —— 通用原始數據流 (推薦)

<?php
// 讀取原始 POST 體
$raw = file_get_contents('php://input');

// 應用場景 A: JSON API
$data = json_decode($raw, true); // 關聯陣列

// 應用場景 B: XML/SOAP
$xml = simplexml_load_string($raw);

// 應用場景 C: 文件上傳 (非 multipart)
file_put_contents('upload.bin', $raw);

// 應用場景 D: 簽名驗證 (需原始體計算 HMAC)
$signature = hash_hmac('sha256', $raw, $secret);
?>
  • 可多次讀取 (PHP 5.6+),舊版本只能讀一次,建議賦值變量復用。
  • 不佔用 $_POST 解析內存,大數據流優勢明顯。
  • 不可用於 multipart/form-data (文件上傳標準表單)。

3. $HTTP_RAW_POST_DATA —— 歷史遺留 (已棄用)

<?php
// 需 php.ini: always_populate_raw_post_data = On (PHP 5.6 預設 Off)
$raw = $GLOBALS['HTTP_RAW_POST_DATA']; // 或 $HTTP_RAW_POST_DATA
?>
  • PHP 5.6 引入 always_populate_raw_post_data 選項控制是否自動填充。
  • PHP 7.0 發出 E_DEPRECATED;PHP 8.0 完全移除。
  • 嚴禁在新代碼中使用,統一遷移至 php://input。

實戰演示:三通道接收對比

<?php
// post_receiver.php
header("Content-Type: text/html; charset=utf-8");

echo "1. \$_POST 接收:<br/>";
print_r($_POST);
echo "<hr/>";

echo "2. \$GLOBALS['HTTP_RAW_POST_DATA'] 接收:<br/>";
print_r($GLOBALS['HTTP_RAW_POST_DATA'] ?? '未填充 (需啟用 always_populate_raw_post_data)');
echo "<hr/>";

echo "3. php://input 接收:<br/>";
$raw = file_get_contents('php://input');
print_r(urldecode($raw)); // 表單數據需手動 urldecode
echo "<hr/>";
?>

測試表單 (test.html)

<form action="post_receiver.php" method="post">
    Name: <input name="name"><br>
    Email: <input name="email"><br>
    <input type="submit">
</form>

選型決策樹

  1. 客戶端為瀏覽器表單 / 标準 AJAX → $_POST。
  2. 客戶端為移動 App / 第三方 Webhook / JSON API / XML / 二進制流 → php://input。
  3. 需同時支援表單與 JSON → 判斷 $_SERVER['CONTENT_TYPE'] 分流處理。

多類型兼容接收器範例

<?php
function getPostData() {
    $contentType = $_SERVER['CONTENT_TYPE'] ?? '';
    
    if (strpos($contentType, 'application/json') === 0) {
        return json_decode(file_get_contents('php://input'), true);
    }
    if (strpos($contentType, 'application/xml') === 0 || strpos($contentType, 'text/xml') === 0) {
        return simplexml_load_string(file_get_contents('php://input'));
    }
    // 默認表單
    return $_POST;
}

$data = getPostData();
// 統一業務邏輯處理 $data
?>

理解三通道本質差異,按 Content-Type 精準分流,是構建健壯 API 接入層的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved