[PHP]不同作業系統下PHP接收POST資料問題 (轉)

amyz發表於2007-08-15
[PHP]不同作業系統下PHP接收POST資料問題 (轉)[@more@]

 

不同操作下

 

接收HTTP POST資料問題

 :namespace prefix = o ns = "urn:schemas--com::office" />

版本

建立時間

建立人

備註

1.0.0606.1

-6-6

鄭  昀

第一稿

 

 

 

 

pe:

本文件將說明PHP頁面接收HTTPPOST的資料問題。一般來說,POST過來的二進位制資料流,只需要PHP$HTTP_RAW_POST_DATA就可以接收。但是,我們遇到的情況卻不是這樣。

 

繼續閱讀之前,我們假設您熟悉以下知識:

PHP

MSXML2.Server

HTTP POST

 

現象

我們遇到了這麼一個問題:

我從 2000上,利用MSXML2.ServerXMLHTTP介面向 Apche下的PHP頁面POST二進位制資料流。

PHP頁面的$HTTP_RAW_POST_DATA變數為空,得不到資料,而且sizeof($_POST)的值也是0。

 

但是,如果我同樣向一個 IIS下的PHP頁面POST資料,卻可以用$HTTP_RAW_POST_DATA接收到正常資料。

為什麼二者有這種區別呢?

環境資訊

發起HTTP POST請求方·系統環境

Professional(Service Pack 1)

MSXML3.Dll(SP3 / 版本號:8.30.9926.0)

ServerXMLHTTP的程式碼是:

   MSXML2::IServerPtr pIXMLHttpRequest = NULL;

  HRESULT hr = pIXMLHttpRequest.CreateInstance("MSXML2.ServerXMLHTTP");

  hr = pIXMLHttpRequest->open(L"POST",

  bstrPHPURL,

  VARIANT_FALSE,  // 同步傳送

  vtMissing,

  vtMissing);

  hr = pIXMLHttpRequest->send(varData);

 

正確接收POST請求的PHP for MS Windows·系統環境

$HTTP_RAW_POST_DATA正常接收了資料的PHP for Windows資訊:

PHP Version 4.2.2

System

5.1 build 2600

Server

CGI

關於使用這個全域性變數的相關設定:

Directive

Local Value

Master Value

always_populate_raw_post_data

0

0

 

無法接收POST請求的PHP for Linux·系統環境

無法用$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

Registered PHP Streams

php, http,

關於使用這個全域性變數的相關設定:

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的,但是PHP維護人員說肯定不是。

解決步驟

不知道Windows下的PHP 4.2.2怎麼一直可以接收。

但是如果我顯式宣告Content-Typefile的話,Linux下的PHP 4.3.2RC3就可以正常接收POST資料了。

設定頭資訊的程式碼如下:

hr = pIXMLHttpRequest->setRequestHeader(

  _bstr_t("Content-Type"),

  _bstr_t("file"));

 

這樣做的話,PHP 4.2.2 for WindowsPHP 4.3.2RC3 for Linux都可以用$HTTP_RAW_POST_DATA接收,沒有問題。

 

總結:

如果你的$HTTP_RAW_POST_DATA不在那兒了,你可以在呼叫HTTP元件傳送HTTP POST請求時,指定Content-Typefile

 

Disclaimers:

本文件所包含的資訊代表了在釋出之日,zhengyun對所討論問題的當前看法。本文件不應理解為zhengyun一方的承諾,zhengyun不保證所給資訊在釋出之日以後的準確性。

本文件僅供參考。

必須遵守所有適用的版權法。在不對版權法所規定的權利加以限制的情況下,如未得到 zhengyunCSDN明確的書面許可,不得出於任何目的、以任何形式或手段(電子的、機械的、影印、錄製等等)複製、傳播本文的任何部分,也不得將其或引入到檢索系統中。

 

Thank wyp;

Written by zhengyun (at) tomosoft.com

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958665/,如需轉載,請註明出處,否則將追究法律責任。

相關文章