Laravel中680MB文件转JSON POST上传失败,服务器无响应
大文件POST上传失败的排查方案
1. Apache层面的硬性限制
Apache本身的配置可能截断大请求,和PHP设置无关:
LimitRequestBody:这个参数控制Apache允许的请求体最大字节数,部分Plesk默认模板会设置上限(比如1GB以内)。需要确认虚拟主机或全局Apache配置中该值是否大于900MB(680MB文件Base64编码后会膨胀33%,约904MB),建议设为LimitRequestBody 0(不限制)或LimitRequestBody 1000000000(约954MB)。Timeout:大文件上传耗时更长,默认300秒可能不够,将Apache的Timeout参数调至600秒,避免上传过程中连接超时断开。
2. Plesk面板的额外限制
Plesk Obsidian会覆盖部分Apache/PHP配置:
- 进入域名 > 主机设置 > 性能,检查“最大请求大小”选项,将值调整至大于900MB。
- 若开启ModSecurity,它会拦截超大请求:临时关闭ModSecurity测试上传,若恢复正常,再调整ModSecurity的
SecRequestBodyLimit和SecRequestBodyNoFilesLimit参数,设置为足够大的值。
3. PHP未覆盖的相关参数
即使已调整memory_limit和post_max_size,仍需检查:
upload_max_filesize:虽未直接传文件,但部分环境下该参数会间接影响POST请求处理,设为与post_max_size一致的4GB。max_input_time:大体积Base64字符串解析耗时久,120秒可能不足,调至300秒。
4. 传输方式优化建议
Base64编码的体积膨胀是核心负担,建议:
- 直接上传二进制文件,而非转成Base64嵌入JSON,减少33%的传输体积和服务器解析压力。
- 若必须用JSON,采用分块上传:将大文件拆分为多个小Base64块,分多次请求上传,最后在服务器端拼接。
5. 无权限下的调试方法
- 用
curl -v上传,观察连接断开时的状态码(比如413 Request Entity Too Large可直接定位大小限制)。 - 部署极简接收脚本排查请求是否被截断:
<?php $logFile = 'upload_debug.log'; // 记录请求头中的内容长度 file_put_contents($logFile, date('Y-m-d H:i:s') . " - Content-Length: {$_SERVER['CONTENT_LENGTH']}\n", FILE_APPEND); // 读取并记录实际接收的内容长度 $rawContent = file_get_contents('php://input'); file_put_contents($logFile, date('Y-m-d H:i:s') . " - Received Length: " . strlen($rawContent) . "\n", FILE_APPEND); echo "Received"; ?>
对比日志中的两个长度,若不一致则说明请求被中间环节截断。
内容的提问来源于stack exchange,提问作者Stefano Rutishauser
相关产品推荐
相关产品推荐

