php中PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 php://input有什麼不同

來源:互聯網
上載者:User

Mac Pro 電腦編譯安裝了 PHP 5.6.21,先前的系統運行時報如下警告級錯誤:
Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.

意思是 自動變數 $HTTP_RAW_POST_DATA 已淘汰,將來會被移除,使用 php://input 流方式代替!
 
 
總結:區別 PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 php://input
 
1、HTML <form> enctype Attribute

application/x-www-form-urlencoded  傳送之前所有的字元都會被encoded,(spaces 被轉換為+、特殊字元被轉換為ASCII HEX)

multipart/form-data  沒有字元被encoded,一般用upload
text/plain Spaces被轉換為 + ,但是特殊字元不會被encoded
For example, the key-value pairs
name: Jonathan Doe
age: 23
formula: a + b == 13%!
are encoded as the following raw data:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

$_POST

Array

(

    [name] => Jonathan Doe

    [age] => 23

    [formula] => a + b == 13%!

)


$HTTP_RAW_POST_DATA

print_r($GLOBALS['HTTP_RAW_POST_DATA']);

name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

php://input


$post_data = file_get_contents('php://input');
print_r($post_data);

name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
 
2、$_POST

$_POST是最常用的擷取表單的方式,它是以關聯陣列方式組織提交的資料,並對此進行編碼處理,如urldecode,甚至編碼轉換,識別的資料類型是PHP預設識別的資料類型 application/x-www.form-urlencoded
無法解析如 text/xml,application/json,soap 等非 application/x-www.form-urlencoded 資料類型的內容
 
3、$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 才會生效
當 $_POST 可以取到值時 $HTTP_RAW_POST_DATA 為空白
不能用於 enctype="multipart/form-data"
PHP7中已經移除了這個全域變數,用 php://input 替代,使用 always_populate_raw_post_data 會導致在填充 $HTTP_RAW_POST_DATA 時產生 E_DEPRECATED 錯誤。 請使用 php://input 替代 $HTTP_RAW_POST_DATA, 因為它可能在後續的 PHP 版本中被移除。 設定always_populate_raw_post_data 為 -1 (這樣會強制 $HTTP_RAW_POST_DATA 未定義,所以也不會導致 E_DEPRECATED的錯誤) 來體驗新的行為。
 
4、php://input

php://input 可通過輸入資料流以檔案讀取方式取得未經處理的 POST 未經處理資料,允許讀取 POST 的未經處理資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小。
不需要任何特殊的 php.ini 設定
不能用於 enctype="multipart/form-data"
 
總結

1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
2、如果不能擷取的時候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.