繁体   English   中英

PHP:如何使用Transfer-Encoding读取POST正文:分块,无内容长度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM