[PHP]不同操作系统下PHP接收POST数据问题

系统 2070 0

 

不同操作系统下

 

PHP 接收 HTTP POST 数据问题

 

文档版本

版本

创建时间

创建人

备注

1.0.0606.1

2003-6-6

          

第一稿

 

 

 

 

Implementation Scope

本文档将说明 PHP 页面接收 HTTP 组件 POST 的数据问题。一般来说, POST 过来的二进制数据流,只需要 PHP $HTTP_RAW_POST_DATA 就可以接收。但是,我们遇到的情况却不是这样。

 

继续阅读之前,我们假设您熟悉以下知识:

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 接收到正常数据。

为什么二者有这种区别呢?

环境信息

发起 HTTP POST请求方·系统环境

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,   // 同步发送

                                                               vtMissing,

                                                               vtMissing);

        hr = pIXMLHttpRequest->send(varData);

 

正确接收 POST请求的PHP for MS Windows·系统环境

$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·系统环境

无法用 $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 组件发送 HTTP POST 请求时,指定 Content-Type file

 

Disclaimers

本文档所包含的信息代表了在发布之日, zhengyun 对所讨论问题的当前看法。本文档不应理解为 zhengyun 一方的承诺, zhengyun 不保证所给信息在发布之日以后的准确性。

本文档仅供参考。

用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun CSDN.Net 明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。

 

Thank wyp;

Written by zhengyun (at) tomosoft.com

 

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12720


[PHP]不同操作系统下PHP接收POST数据问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论