首页 > 解决方案 > Apache 2.4 + PHP 7.2 prefork mpm + 文件上传导致 20 秒后部分上传错误

问题描述

我一直注意到一个 Web 应用程序的问题,我们的应用程序处理文件上传的代码会间歇性地遇到文件上传错误 3。我不确定我们的用户是如何触发这个错误的,但我知道那些做了将通过不稳定或缓慢的互联网连接(移动热点、公共 wifi 等)上传文件。因此,我使用 Chrome 开发工具的节流功能(快速 3g)并上传了一个 10mb 的文件,这需要大约一分钟或更长时间才能完成。我们使用 Dropzonejs 库来处理上传,没有任何分块。恰好在 22 - 23 秒后,连接似乎总是中止,但 Apache 仍然继续处理它收到的不完整请求正文并将其传递给 PHP,从而导致部分上传错误。

我似乎无法弄清楚是什么导致了这种情况发生。PHP 配置将 max_execution_time 和 max_input_time 分别设置为 0 和 -1。发布和上传最大大小设置得相对较高,文件上传大小似乎并不重要。只要上传请求的时间超过 22 - 23 秒,就会出现问题。我尝试禁用 mod_reqtimeout 并没有什么不同。我尝试过的其他事情是修改 apache Timeout 值并禁用keepalive,它总是在20秒后给我一些问题(那个时间来自浏览器的网络选项卡)。

我在 apache 的错误日志中看不到任何内容,并且访问日志使这些请求看起来合法,因为 apache 仍然像往常一样继续处理不完整的请求。

我最初认为它可能是 dropzonejs 杀死了 ajax 请求连接,但我还在使用 laradock 的本地开发环境中测试了相同的代码(软件版本会略有不同。仍然是 apache 2.4 和 php 7.2),我无法复制这个问题,所以它不可能是客户端问题。

标签: phpapachefile-upload

解决方案


由于这个问题,我们遇到了同样的问题并解决了。但是,无需完全禁用该模块。问题是由 Apache 2.4.39 中的这个错误引起的:

https://bz.apache.org/bugzilla/show_bug.cgi?id=63325

正如错误报告中所建议的,您可以在 Apache 配置文件中明确设置默认值。


推荐阅读