从使用 Transfer-Encoding 的请求中读取 php://input: chunked
Reading php://input from a request that is using Transfer-Encoding: chunked
在我漫长的职业生涯中第一次,当请求使用 Transfer-Encoding: chunked
(使用 Content-Type: application/json
)
$_POST
显然是空的,因为 Content-Type: application/json
file_get_contents('php://input')
总是空的,希望有人能解释一下为什么; Apache 没有将其传递给 php-fpm 吗?
尝试使用 fopen
检索块也失败了吗?
$hSource = fopen('php://input', 'r');
$body = '';
while (!feof($hSource)) {
$chunk = fread($hSource, 1024);
$body .= $chunk;
}
fclose($hSource);
这是 dead-end 还是我的做法完全错误?我知道如果我有服务添加 Content-Length header 那么以上所有实际上都可以正常工作,但他们强调这个 5 分钟的任务将花费他们几个月的时间才能完成。
Apache downgrade-1.0
(ew...) 也不强制他们将请求发送为 HTTP/1.0.
谢谢
在我的场景中,这是由于@Phil 在评论中指出的错误
这特别影响 php-fpm,对于大多数用户来说,他们可以将 Apache 升级到 2.4.46+。
错误: https://bz.apache.org/bugzilla/show_bug.cgi?id=57087
如果您是 Debian 用户,在撰写本文时; 2.4.46 还没有正式的 稳定 版本,它正处于测试阶段,如图 here 所示。我们在等待稳定版本的同时回退到 mod_php,其他人可能倾向于使用 Nginx。
编辑 Debian 现在发布了一个稳定版本,修复了这个问题,他们只用了 10 年时间,时机再好不过了。
在我漫长的职业生涯中第一次,当请求使用 Transfer-Encoding: chunked
(使用 Content-Type: application/json
)
$_POST
显然是空的,因为 Content-Type: application/json
file_get_contents('php://input')
总是空的,希望有人能解释一下为什么; Apache 没有将其传递给 php-fpm 吗?
尝试使用 fopen
检索块也失败了吗?
$hSource = fopen('php://input', 'r');
$body = '';
while (!feof($hSource)) {
$chunk = fread($hSource, 1024);
$body .= $chunk;
}
fclose($hSource);
这是 dead-end 还是我的做法完全错误?我知道如果我有服务添加 Content-Length header 那么以上所有实际上都可以正常工作,但他们强调这个 5 分钟的任务将花费他们几个月的时间才能完成。
Apache downgrade-1.0
(ew...) 也不强制他们将请求发送为 HTTP/1.0.
谢谢
在我的场景中,这是由于@Phil 在评论中指出的错误
这特别影响 php-fpm,对于大多数用户来说,他们可以将 Apache 升级到 2.4.46+。
错误: https://bz.apache.org/bugzilla/show_bug.cgi?id=57087
如果您是 Debian 用户,在撰写本文时; 2.4.46 还没有正式的 稳定 版本,它正处于测试阶段,如图 here 所示。我们在等待稳定版本的同时回退到 mod_php,其他人可能倾向于使用 Nginx。
编辑 Debian 现在发布了一个稳定版本,修复了这个问题,他们只用了 10 年时间,时机再好不过了。