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

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