从使用 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 年时间,时机再好不过了。