一文搞懂 $_POST 和 file_get_contents ("PHP://input") 的區別

viphper發表於2020-04-15

今天來說一說 $_POST、file_get_contents(“php://input”)和$GLOBALS[‘HTTP_RAW_POST_DATA’]的區別,這三個方法都是用來接收post請求的,但是很少有人說出他們的區別是啥,下面就來說一說

一、$_POST[‘paramName’]

只能接收Content-Type: application/x-www-form-urlencoded提交的資料,php會將http請求body相應資料會 填入到陣列$_POST,填入到$_POST陣列中的資料是進行urldecode()解析的結果。(其實,除了該Content-Type,還有 multipart/form-data表示資料是表單資料)

二、file_get_contents(“php://input”)

適用大多數型別的Content-type,php://input 允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小,並且不需要任何特殊的 php.ini 設定。php://input 不能用於 enctype=”multipart/form-data”。

三、$GLOBALS[‘HTTP_RAW_POST_DATA’];

總是產生 $HTTP_RAW_POST_DATA 變數包含有原始的 POST 資料。此變數僅在碰到未識別 MIME 型別的資料時產生。$HTTP_RAW_POST_DATA 對於 enctype=”multipart/form-data” 表單資料不可用。

特別注意此方式在php版本低的時候,並且php.ini配置開啟always_populate_raw_post_data值為On可以使用,php7之後就廢棄了。

總結一下

1、Coentent-Type僅在取值為application/x-www-data-urlencoded和multipart/form- data兩種情況下,PHP才會將http請求資料包中相應的資料填入全域性變數$_POST

2、PHP不能識別的Content-Type型別的時候,會將http請求包中相應的資料填入變數$HTTP_RAW_POST_DATA

3、 只有Coentent-Type不為multipart/form-data的時候,PHP不會將http請求資料包中的相應資料填入php: //input,否則其它情況都會。填入的長度,由Coentent-Length指定。

4、只有Content-Type為application/x-www-data-urlencoded時,php://input資料才 跟$_POST資料相一致。

5、php://input資料總是跟$HTTP_RAW_POST_DATA相同,但是php://input 比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設定php.ini

6、PHP會將PATH欄位的query_path部分,填入全域性變數$_GET。通常情況下,GET方法提交的http請求,body為空。

總之:

1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;

2、如果不能獲取的時候比如 text/xml、application/json、soap,使用 file_get_contents(‘php://input’);

看完這個大家應該明白為啥我們和第三方平臺對接介面的時候用file_get_contents(“php://input”)比較多。

最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題

本作品採用《CC 協議》,轉載必須註明作者和本文連結

和PHP學習網一起努力學習

相關文章