$_POST,$HTTP_RAW_POST_DATA,php://input

weixin_34146805發表於2017-07-28

$POST

$_POST是我們最常用的獲取POST資料的方式,它是以關聯陣列方式組織提交的資料,並對此進行編碼處理,如urldecode,甚至編碼轉換,識別的資料型別是PHP預設識別的資料型別 application/x-www.form-urlencoded

無法解析如text/xml,application/json等非 application/x-www.form-urlencoded 資料型別的內容

HTTP_RAW_POST_DATA

前面說過PHP預設識別的資料型別是application/x-www.form-urlencoded,用Content-Type=application/json 型別,提交的POST資料這時候 $_POST 就無法獲取到了,但是使用 $GLOBALS['HTTP_RAW_POST_DATA'] 可以獲取到。因為在PHP無法識別Content-Type的時候,就會把 POST 資料填入到$HTTP_RAW_POST_DATA `中。

  • 需要設定 php.ini 中的 always_populate_raw_post_data 值為 On 才會生效

  • $_POSTphp://input可以取到值時 $HTTP_RAW_POST_DATA 為空

  • 不能用於 enctype="multipart/form-data"

  • PHP7中已經移除了這個全域性變數,用php://input 替代

php://input

php://input 可通過輸入流以檔案讀取方式取得未經處理的POST原始資料,允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小。

  • 不需要任何特殊的 php.ini 設定

  • 不能用於 enctype="multipart/form-data"

小結
上面了介紹了一下我們目前使用PHP獲取POST資料的三種方式,當我們以後使用PHP來獲取POST資料的時候用$_POST或者php://input就好了。雖然HTTP_RAW_POST_DATA可以達到和php://input一樣的目的,但是會給記憶體帶來較大的壓力,官方也注意到了這個問題,所以在PHP7就果斷移除了這個不好用的東東。。。

相關文章