PHP:如何使用Transfer-Encoding读取POST主体:chunked,no Content-Length

时间:2015-06-18 19:21:57

标签: php apache http-headers

我正在编写一项服务,以便从我家的能源监控设备接收数据。设备推送数据的唯一方法是使用HTTP POSTTransfer-Encoding: chunked,而不是Content-Length,并将数据作为请求正文中的XML。

我希望能够在PHP脚本(Apache后面)中读取这些数据并将其存储在我的数据库中。

现在看来,在PHP中阅读HTTP请求主体的最正确方法是打开并阅读php://input。但是,来自PHP网站用户的评论表明(我的测试确认),如果客户端没有指定Content-Length标头,php://input将不返回任何数据(即使有数据存在)由客户端以分块编码发送的。)

是否有其他方式可以访问请求正文?我可以配置Apache(使用.htaccess)来解码分块数据并在获得所有内容后调用我的脚本,并包含Content-Length吗?或者配置PHP以便它能够处理这个?

谢谢!

1 个答案:

答案 0 :(得分:3)

不妨把这个写成我想的答案。

您所描述的问题在此处记录:https://bugs.php.net/bug.php?id=60826

主题摘要:

  

所以这就是我发现的。如果您发送chunked http请求但不发送   发送内容长度(我们应该使用HTTP 1.1协议)   请求的正文部分为空(php://输入什么都不返回)。这个   结果对于运行PHP的以下配置仍然有效   通过FastCGI:

     

与运行mod_php的PHP相同的配置很好,正文   请求可通过php:// input。

获得

  

基本上,PHP遵循规范,而不是超越   FastCGI CONTENT_LENGTH标头值 - 所以正确修复   必须高于PHP,在FastCGI或Web服务器实现中。

可能的解决方法:

0)将httpd与mod_php一起使用

1)使用其他网络服务器。

2)查看mod_fcgid的补丁

3)也许(不推荐)翻转always_populate_raw_post_data并查看$HTTP_RAW_POST_DATA

中是否有任何内容