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

PHP 中 php://input 與 $_POST 的差異解析

     編輯:PHP 相關知識

核心差異速覽

特性$_POSTphp://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)

實例演示

場景一:表單提交(application/x-www-form-urlencoded)

<!-- 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

場景二:JSON API 請求(application/json)

前端發送 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 )

深度解析

1. $HTTP_RAW_POST_DATA 的棄用

早期 PHP 使用 $HTTP_RAW_POST_DATA 獲取原始數據,但需在 php.ini 開啟 always_populate_raw_post_data = On,且不支持 multipart/form-data。PHP 5.6 棄用,7.0 移除。php://input 是現代替代方案。

2. 為什麼 $_POST 無法獲取 JSON?

PHP 只會自動解析 application/x-www-form-urlencoded 和 multipart/form-data 類型的請求體填充 $_POST。其他類型(JSON、XML、純文本)需自行從 php://input 讀取解析。

3. multipart/form-data 的特殊性

文件上傳使用 multipart/form-data,PHP 會自動解析並填充 $_POST(字段)和 $_FILES(文件)。php://input 無法讀取此類型,嘗試讀取將返回空字符串。

最佳實踐建議

  • 常規表單:直接使用 $_POST,代碼簡潔。
  • RESTful API(JSON/XML):使用 file_get_contents('php://input') 獲取原始數據,再 json_decode 或 simplexml_load_string 解析。
  • 大數據流:使用 fopen('php://input', 'r') 分塊讀取,避免一次性載入大內存。
  • 兼容性:php://input 在 PHP 4.3+ 可用,無需額外配置。

總結

$_POST 是針對標準表單的高級封裝,php://input 是通用的底層輸入流。理解二者的適用邊界,是構建健壯 PHP 應用(特別是 API 服務)的基礎。

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