摘自:http://dianjingjiaoyu.blog.163.com/blog/static/18347920820114194642257/php
最近用到ext與PHP交互,ext把json數據post給PHP,但在PHP裏面$_POST獲取不到,$_REQUEST也獲取不到,可是經過firedebug看到的請求信息確實是把JSON數據post給了PHP,這什麼狀況...忽然想到了之前接觸過flash將圖片二進制流傳給php,靈機一動用 $GLOBALS['HTTP_RAW_POST_DATA'] 獲取到了。因而就深刻的查了一下,原來PHP默認只識別application/x-www.form-urlencoded標準的數據類型,所以,對型如 text/xml 或者 soap 或者 application/octet-stream 之類的內容沒法解析,若是用$_POST數組來接收就會失敗!故保留原型,交給 $GLOBALS['HTTP_RAW_POST_DATA'] 來接收。ajax
摘自:http://7297576.blog.163.com/blog/static/72686442201022981219526/json
用Content-Type=text/xml 類型,提交一個xml文檔內容給了php server,要怎麼得到這個POST數據。數組
The RAW / uninterpreted HTTP POST information can be accessed with: $GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).app
因爲PHP默認只識別application/x-www.form-urlencoded標準的數據類型,所以,對型如text/xml的內容沒法解析爲$_POST數組,故保留原型,交給$GLOBALS['HTTP_RAW_POST_DATA'] 來接收。less
另外還有一項 php://input 也能夠實現此這個功能post
php://input 容許讀取 POST 的原始數據。和 $GLOBALS['HTTP_RAW_POST_DATA'] 比起來,它給內存帶來的壓力較小,而且不須要任何特殊的 php.ini 設置。php://input 不能用於 enctype="multipart/form-data"。學習
應用url
a.htm
------------------
<form action="post.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>
post.php
----------------------------
<? echo file_get_contents("php://input"); ?> spa
摘自:http://hi.baidu.com/lq3158/item/74ac0bbffdad5fa4eaba93e1
在經過ajax向php程序中傳遞數據時,會發現使用$_POST根本沒法獲取數據,可是在firebug中能夠看到post中實際上是有json數據的。
在使用 print_r(file_get_contents("php://input")) 以後,卻能夠獲得json數據。
那什麼是php://input呢?
對php://input的介紹,PHP官方手冊文檔有一段話對它進行了很明確地概述。
「php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=」multipart/form-data」.
翻譯過來,是這樣:
「php://input能夠讀取沒有處理過的POST數據。相較於$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,而且不須要特殊的php.ini設置。php://input不能用於enctype=multipart/form-data」。
一、Content-Type取值爲application/x-www-form-urlencoded時,php會將http請求body相應數據會填入到數組$_POST,填入到$_POST數組中的數據是進行urldecode()解析的結果。(其實,除了該Content-Type,還有multipart/form-data表示數據是表單數據,稍後咱們介紹)
二、php://input數據,只要Content-Type不爲multipart/form-data(該條件限制稍後會介紹)。那麼php://input數據與http entity body部分數據是一致的。該部分相一致的數據的長度由Content-Length指定。
三、僅當Content-Type爲application/x-www-form-urlencoded且提交方法是POST方法時,$_POST數據與php://input數據纔是」一致」(打上引號,表示它們格式不一致,內容一致)的。其它狀況,它們都不一致。
四、php://input讀取不到$_GET數據。是由於$_GET數據做爲query_path寫在http請求頭部(header)的PATH字段,而不是寫在http請求的body部分。
相信你們對php://input已經有必定深度地瞭解了。那麼$http_raw_post_data是什麼呢?$http_raw_post_data是PHP內置的一個全局變量。它用於,PHP在沒法識別的Content-Type的狀況下,將POST過來的數據原樣地填入變量$http_raw_post_data。它一樣沒法讀取Content-Type爲multipart/form-data的POST數據。須要設置php.ini中的always_populate_raw_post_data值爲On,PHP纔會總把POST數據填入變量$http_raw_post_data。
一、Coentent-Type僅在取值爲application/x-www-data-urlencoded和multipart/form-data兩種狀況下,PHP纔會將http請求數據包中相應的數據填入全局變量$_POST
二、PHP不能識別的Content-Type類型的時候,會將http請求包中相應的數據填入變量$HTTP_RAW_POST_DATA
三、只有Coentent-Type不爲multipart/form-data的時候,PHP不會將http請求數據包中的相應數據填入php://input,不然其它狀況都會。填入的長度,由Coentent-Length指定。
四、只有Content-Type爲application/x-www-data-urlencoded時,php://input數據纔跟$_POST數據相一致。
五、php://input數據老是跟$HTTP_RAW_POST_DATA相同,可是php://input比$HTTP_RAW_POST_DATA更湊效,且不須要特殊設置php.ini
六、PHP會將PATH字段的query_path部分,填入全局變量$_GET。一般狀況下,GET方法提交的http請求,body爲空。