?
不同操作系統下
?
PHP 接收 HTTP POST 數據問題
?
文檔版本
版本
|
創(chuàng)建時間
|
創(chuàng)建人
|
備注
|
1.0.0606.1 |
2003-6-6 |
鄭 ?????????? 昀 |
第一稿 |
?
|
?
|
?
|
?
|
Implementation Scope :
本文檔將說明
PHP
頁面接收
HTTP
組件
POST
的數據問題。一般來說,
POST
過來的二進制數據流,只需要
PHP
用
$HTTP_RAW_POST_DATA
就可以接收。但是,我們遇到的情況卻不是這樣。
?
繼續(xù)閱讀之前,我們假設您熟悉以下知識:
n
????????
PHP
n
????????
MSXML2.ServerXMLHTTP
n
????????
HTTP POST
?
現象
我們遇到了這么一個問題:
我從
Windows 2000
上,利用
MSXML2.ServerXMLHTTP
接口向
Linux Apche
下的
PHP
頁面
POST
二進制數據流。
PHP
頁面的
$HTTP_RAW_POST_DATA
變量為空,得不到數據,而且
sizeof($_POST)
的值也是
0
。
?
但是,如果我同樣向一個
Windows 2000 IIS
下的
PHP
頁面
POST
數據,卻可以用
$HTTP_RAW_POST_DATA
接收到正常數據。
為什么二者有這種區(qū)別呢?
環(huán)境信息
發(fā)起
HTTP POST請求方·系統環(huán)境
Windows XP Professional(Service Pack 1)
MSXML3.Dll(SP3 /
版本號:
8.30.9926.0)
調用
ServerXMLHTTP
的代碼是:
??
????
MSXML2::IServerXMLHTTPRequestPtr pIXMLHttpRequest = NULL;
?????????????
HRESULT hr = pIXMLHttpRequest.CreateInstance("MSXML2.ServerXMLHTTP");
???????
hr = pIXMLHttpRequest->open(L"POST",
??????????????????????????????????????????????????????????????
bstrPHPURL,
??????????????????????????????????????????????????????????????
VARIANT_FALSE,
?
//
同步發(fā)送
??????????????????????????????????????????????????????????????
vtMissing,
??????????????????????????????????????????????????????????????
vtMissing);
???????
hr = pIXMLHttpRequest->send(varData);
?
正確接收
POST請求的PHP for MS Windows·系統環(huán)境
用
$HTTP_RAW_POST_DATA
正常接收了數據的
PHP for Windows
安裝信息:
PHP Version 4.2.2
System
|
Windows NT 5.1 build 2600
|
Server API
|
CGI
|
關于使用這個全局變量的相關設置:
Directive
|
Local Value
|
Master Value
|
always_populate_raw_post_data
|
0
|
0
|
?
無法接收
POST請求的PHP for Linux·系統環(huán)境
無法用
$HTTP_RAW_POST_DATA
接收
POST
數據的
PHP for Linux
安裝信息:
PHP Version 4.3.2RC3
System
|
Linux atm2 2.4.18-1 #1 Wed May 29 10:45:23 CST 2002 i686
|
Server API
|
Apache
|
Registered PHP Streams
|
php, http, ftp
|
關于使用這個全局變量的相關設置:
Directive
|
Local Value
|
Master Value
|
always_populate_raw_post_data
|
On
|
On
|
?
?
更多信息
照理說,只要
php.ini
中定義了
; Always populate the $HTTP_RAW_POST_DATA variable.
always_populate_raw_post_data = On
就完全可以用
$HTTP_RAW_POST_DATA
變量來接收數據。
起碼
$_POST
變量是可以測算出
POST
到頁面的數據大小的。
?
我確實看到有幾個人試圖報告“
Empty $HTTP_RAW_POST_DATA
”是一個
PHP
的
Bug
,但是
PHP
維護人員說肯定不是。
解決步驟
不知道
Windows
下的
PHP 4.2.2
怎么一直可以接收。
但是如果我顯式聲明
Content-Type
為
file
的話,
Linux
下的
PHP 4.3.2RC3
就可以正常接收
POST
數據了。
設置頭信息的代碼如下:
hr = pIXMLHttpRequest->setRequestHeader(
??????????????????????????????????????????????????????????????
_bstr_t("Content-Type"),
??????????????????????????????????????????????????????????????
_bstr_t("file"));
?
這樣做的話,
PHP 4.2.2 for Windows
和
PHP 4.3.2RC3 for Linux
都可以用
$HTTP_RAW_POST_DATA
接收,沒有問題。
?
總結:
如果你的 $HTTP_RAW_POST_DATA 不在那兒了 ,你可以在調用 HTTP 組件發(fā)送 HTTP POST 請求時,指定 Content-Type 為 file 。
?
Disclaimers :
本文檔所包含的信息代表了在發(fā)布之日,
zhengyun
對所討論問題的當前看法。本文檔不應理解為
zhengyun
一方的承諾,
zhengyun
不保證所給信息在發(fā)布之日以后的準確性。
本文檔僅供參考。
用戶必須遵守所有適用的版權法。在不對版權法所規(guī)定的權利加以限制的情況下,如未得到
zhengyun
和
CSDN.Net
明確的書面許可,不得出于任何目的、以任何形式或手段(電子的、機械的、影印、錄制等等)復制、傳播本文的任何部分,也不得將其存儲或引入到檢索系統中。
?
Thank wyp;
Written by zhengyun (at) tomosoft.com
?
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12720
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
