![](/img/trans.png)
[英]How to download a page with “Transfer-Encoding:chunked” prior to PHP 5.2
[英]PHP: How to read POST body with Transfer-Encoding: chunked, no Content-Length
我正在编写一项服务,以从家里的能源监控设备接收数据。 设备可以推送数据的唯一方法是使用HTTP POST
(具有Transfer-Encoding: chunked
,没有Content-Length
,并且将数据作为XML放入请求正文中。
我希望能够在PHP脚本(Apache后面)中读取此数据并将其存储在我的数据库中。
如今,在PHP中读取HTTP请求正文的最正确方法似乎是打开并读取php://input
。 但是,PHP网站上用户的评论表明(并且我的测试确认),如果客户端未指定Content-Length
标头,则php://input
不会返回任何数据(即使客户端正在分块发送数据)编码)。
是否有其他方法可以访问请求正文? 我是否可以配置Apache(使用.htaccess)来解码分块的数据,并在获得全部数据后调用我的脚本,并包括Content-Length
? 还是配置PHP,以便能够处理此问题?
谢谢!
最好将其写为我想的答案。
您描述的问题记录在这里: https : //bugs.php.net/bug.php?id=60826
主题集锦:
所以这就是我发现的。 如果您发送了分块的http请求,但没有发送内容长度(如我们应该使用HTTP 1.1协议那样),则请求的正文部分为空(php:// input不返回任何内容)。 对于以下通过FastCGI运行PHP的配置,此结果仍然有效:
与运行mod_php的PHP相同的配置很好,可以通过php:// input获得主体请求。
和
本质上,PHP遵循规范,并且读取的内容不超出FastCGI CONTENT_LENGTH标头值-因此,在FastCGI或Web服务器实现中,正确的修补程序必须高于PHP。
可能的解决方法:
0)将httpd与mod_php一起使用
1)使用其他Web服务器。
2)查看mod_fcgid的补丁
3)也许(不建议)翻转always_populate_raw_post_data
并查看$ HTTP_RAW_POST_DATA中是否有任何内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.