我正在编写一项服务,以便从我家的能源监控设备接收数据。设备推送数据的唯一方法是使用HTTP POST
,Transfer-Encoding: chunked
,而不是Content-Length
,并将数据作为请求正文中的XML。
我希望能够在PHP脚本(Apache后面)中读取这些数据并将其存储在我的数据库中。
现在看来,在PHP中阅读HTTP请求主体的最正确方法是打开并阅读php://input
。但是,来自PHP网站用户的评论表明(我的测试确认),如果客户端没有指定Content-Length
标头,php://input
将不返回任何数据(即使有数据存在)由客户端以分块编码发送的。)
是否有其他方式可以访问请求正文?我可以配置Apache(使用.htaccess)来解码分块数据并在获得所有内容后调用我的脚本,并包含Content-Length
吗?或者配置PHP以便它能够处理这个?
谢谢!
答案 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