php - jQuery/PHP 文件上传在 99% 处重新启动,然后返回超时
问题描述
我在 EC2 实例上运行的 AMI Linux 上上传 jQuery/PHP 文件时遇到了一些问题。我尝试使用这个和其他几个插件(只是为了确保问题不在于插件本身),结果相同。尝试上传 14MB PDF 时,进度条达到 75%(或更多,最高 99%),然后从 0% 重新开始,再次达到 75%(或更多,最高 99%),然后它就停止了没有错误(甚至没有说Request Timeout
)。做了几次尝试,只有几次进度条没有重新启动就达到了99%,然后弹出错误说Request Timeout
。这是我在 apache 中发现的access_log
:
12.34.56.78 - - [02/Jul/2019:15:50:09 +0000] “POST /uploader/demo/backend/upload.php HTTP/1.1”408 221
12.34.56.78 - - [02/Jul/2019:15:50:31 +0000] “POST /uploader/demo/backend/upload.php HTTP/1.1”408 221
所以它打印408 Request Timeout
在 2 行上(实际上上传重新启动一次)。上传需要 22 或 23 秒(从日志中可以看出)。
这就是我设置我的方式php.ini
(我使用的是 PHP 7.1 FPM):
max_execution_time = 360
max_input_time = 360
memory_limit = 256M
post_max_size = 100M
upload_max_filesize = 100M
phpinfo()
表明这些值已正确应用。我还尝试在文件中使用set_time_limit(0)
和设置所有上述值,但没有任何改变。上传目录具有适当的权限,实际上一个 9.3MB 的 PDF 正确上传,没有错误。upload.php
ini_set()
在我的一项尝试中,我还尝试设置这些 apache 指令:
KeepAlive On
KeepAliveTimeout 360
TimeOut 360
唯一的结果是上传进度一直达到 99% 并重新启动几次,而不是只重新启动一次。
现在我没有想法了,提出的大多数解决方案都与php.ini
我的情况下正确应用的设置有关。
解决方案
经过数小时的尝试,我一发布我的问题,就找到了答案。它可能对任何有同样问题的人有用。如果我的问题中列出的所有其他内容都不起作用,则可能是由于mod_reqtimeout(对我而言)。我只是创建了一个名为:的文件并将/etc/httpd/conf.d/mod_reqtimeout.conf
其放入其中:
<IfModule reqtimeout_module>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
正如上面链接的 apache 文档所建议的那样。然后我重新启动了 apache,上传达到 100% 没有问题。
mod_security
当我尝试使用 60MB PDF 时,也参与其中。我必须设置以下设置以匹配在php.ini
里面设置的 100MB 限制/etc/httpd/conf.d/mod_security.conf
:
SecRequestBodyLimit 100000000
推荐阅读
- java - 如何使用线程 ID 在 java 中获取线程运行时间?
- mysql - MySQL 查询 - 重命名数据?
- selenium - Safari 驱动程序每次都要求在 selenium 中启用“允许远程自动化”
- python - 使用 scikit learn 在 Logistic 回归中所有系数都变为零
- jenkins - Groovy File 类放置反斜线而不是斜线
- android - Android Studio 新抽屉活动不显示任何组件,但布局名称出现在设计器上
- java - 使用 Cassandra 重新准备查询 - 在哪里初始化 PreparedStatement
- php - 用mysql登录php
- python - 如何提取 Scapy 中的原始负载?
- python-3.x - SciPy curve_fit 返回奇怪的拟合曲线