我一直注意到一个Web应用程序存在问题,该应用程序处理文件上传的代码会间歇性地遇到文件上传错误3。我不确定我们的用户是如何触发此错误的,但是我知道这样做的人将通过不稳定或速度较慢的互联网连接(移动热点,公共wifi等)上传文件。因此,我通过使用Chrome Dev Tools的限制功能(快速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),但我无法复制问题,因此它不可能是客户端问题。
答案 0 :(得分:1)
好像是mod_reqtimeout停止了我的发帖请求。我认为当我最初尝试禁用它时,我的apache更改并没有完全传播(我猜是由于我的混合使用了正常重启并启用了keepalive)。
答案 1 :(得分:1)
我们遇到了同样的问题,并通过此问题得以解决。 但是,无需完全禁用该模块。 该问题是由Apache 2.4.39中的此错误引起的:
https://bz.apache.org/bugzilla/show_bug.cgi?id=63325
如错误报告中所建议,您可以在Apache配置文件中显式设置默认值。