云运行无法提供完整文件 - client_disconnected_after_partial_response

问题描述 投票:0回答:1

我们在 GCP 云运行中运行的 PHP 应用程序出现问题。

环境:docker 中的 PHP 8 (nginx php-fpm) - 官方镜像“php:8.1-fpm”。

当客户在我们的系统中打开页面时,某些文件无法发送到客户。我无法在 docker 中本地重现相同的行为(完全相同的图像),所以我猜这是特定于云运行的。

该文件由以下 PHP 代码提供:

...
    header('Last-Modified: ' . $lmstring);
    header('Content-Lenght: ' . filesize($filename));
    readfile($filename);
    die;
}

从云运行中收到此警告:

“响应正文被截断。通常意味着请求超时或应用程序在响应完成之前退出。”

来自 Google HTTPS 负载均衡器的信息日志(错误代码解释此处):

状态详细信息:“client_disconnected_after_partial_response”

真实的例子和我已经发现的一些事实: 打开内部系统中的X页面。此页面下载 Y 个其他文件 - 这些 Y 文件(css+js)中的大多数已成功发送,但有些被截断为约 3641 个字符。所有发送不完整的文件通常都会被截断为相同的长度(很少会少一点)。它总是被截断的相同文件,我没有发现它们有任何共同点。有时是js文件,有时是css文件。响应代码是 HTTP 200。

我在 PHP 错误输出中没有发现任何错误 - 尝试在所有级别上打开错误。在其他情况下,我们通常会从 PHP 中收到错误,所以我不认为任何事情都会被沉默。

有人知道为什么会发生这种情况以及如何处理吗?

php google-cloud-platform fastcgi google-cloud-run fpm
1个回答
2
投票

编辑:问题又回来了,所以这个解决方案似乎只是使问题以较低的频率发生。

看来我找到了解决方案。以下线程中的答案有帮助: 当内容长度在 4013-8092 个字符之间时,Google Cloud Run 网站会超时。这是怎么回事?

尝试解释上述线程中的行为。

在 nginx 中关闭 fastcgi bufferring 有助于解决这个问题:

fastcgi_buffering off;
(nginx.conf)

© www.soinside.com 2019 - 2024. All rights reserved.