1. 程式人生 > >【PHP】關於php://input、$_POST、$HTTP_RAW_POST_DATA的理解及區別

【PHP】關於php://input、$_POST、$HTTP_RAW_POST_DATA的理解及區別

首先明確一點,json格式的資料指的的http頭body的字串是一個json格式的字串。這個在PHP中無法通過$_POST取到,php底層沒有對這種方式進行處理。

  • 手冊中有關php://input的說明
  1. 當 HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時,會將變數以關聯陣列形式傳入當前指令碼。
  2. php://input是個可以訪問請求的原始資料的只讀流。 但當enctype=“multipart/form-data” 的時候無效。
  3. 相較於$HTTP_RAW_POST_DATA而言,它給記憶體帶來的壓力較小,並且不需要特殊的php.ini設定。
  • $_POST

這是我們在資料互動時常用的一種方法,但對於接收json格式的資料而言顯然是行不通的,具體原因在於post是以關聯陣列方式組織提交的資料,並對此進行編碼處理,如urldecode,甚至編碼轉換,識別的資料型別是PHP預設識別的資料型別 application/x-www.form-urlencoded和multipart/form-data,無法解析如text/xml,application/json等非 application/x-www.form-urlencoded 資料型別的內容。

  • $HTTP_RAW_POST_DATA

PHP預設識別的資料型別是application/x-www.form-urlencoded,當Content-Type=application/json 型別時無法通過 $_POST獲取,但是使用 GLOBALS[‘HTTP_RAW_POST_DATA’] 可以獲取到。因為在PHP無法識別Content-Type的時候,就會把 POST 資料填入HTTP_RAW_POST_DATA 中。 但這種方法需要設定 php.ini 中的 always_populate_raw_post_data 值為 On 才會生效,且當POST 與 php://input可以取到值時 $HTTP_RAW_POST_DATA 為空,當 enctype="multipart/form-data"時也無法使用。

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

  • php://input

只有在Coentent-Type為multipart/form-data的時候,PHP不會將http請求資料包中的相應資料填入php://input,否則其它情況都會。填入的長度,由Coentent-Length指定。且只有Content-Type為application/x-www-data-urlencoded時,php://input資料才跟$_POST資料相一致(格式不一致,內容一致)。

PS:關於enctype=multipart/form-data的意義,就是將該次http請求頭部(head)中的Content-Type設定為multipart/form-data。multipart/form-data也表示以POST方法提交表單資料,它還伴隨了檔案上傳,所以會跟application/x-www-form-urlencoded資料格式不一樣。它會以一更種更合理的,更高效的資料格式傳遞給服務端。