Laravel表单提交大文件过慢求助:600MB文件需10-15分钟
解决Laravel大文件上传耗时过长的问题
针对你遇到的600MB视频在Laravel中上传耗时10-15分钟,而相同环境下普通WAMP项目仅需5秒的问题,除了已调整的post_max_size、upload_max_filesize和memory_limit,可以从以下几个方向排查解决:
1. 补充调整PHP的关键配置参数
除了已修改的三个参数,还需确保以下参数设置合理:
max_input_time:设置为足够大的值(如3600,单位秒),大文件上传时PHP处理输入数据需要更长时间,默认值可能不足以支撑。max_execution_time:同样调整为3600或更大,避免脚本超时(虽然上传阶段主要受max_input_time影响,但保险起见一并调整)。
修改后重启WAMP的Apache和PHP服务,通过phpinfo()确认参数生效。
2. 检查Apache服务器配置
WAMP使用Apache作为Web服务器,需调整以下配置(找到Apache的httpd.conf或httpd-vhosts.conf文件):
Timeout:默认是300秒,大文件上传需要更长时间,建议改为3600(1小时)。LimitRequestBody:确保该值设置为0(不限制)或大于3GB的字节数(3GB=3221225472字节),避免Apache限制请求体大小。
修改后重启Apache服务。
3. 排查Laravel中间件的影响
Laravel的全局中间件可能对请求处理产生额外开销,可临时测试:
- 临时将上传路由排除在全局中间件之外,比如在
app/Http/Kernel.php的$middleware数组中,注释掉非必要的中间件(如TrimStrings、ConvertEmptyStringsToNull等),测试上传速度是否改善。 - 如果使用了第三方中间件(如日志、监控类),暂时禁用这些中间件,排查是否是它们导致的性能损耗。
4. 绕过Laravel请求解析层测试
尝试直接使用原生PHP的文件上传变量,排查是否是Laravel的请求解析逻辑导致的性能问题:
在控制器中修改代码为:
public function createVideo() { var_dump($_FILES['video']); }
测试上传速度是否有提升。
5. 实现分块上传(推荐方案)
对于3GB级别的大文件,单块上传本身就存在耗时久、易中断的问题,建议实现分块上传:
- 前端使用JavaScript将文件分割为多个小块(如每块100MB),逐个向服务器发送请求。
- 后端控制器接收每个分块,保存到临时目录,所有分块上传完成后再合并为完整文件。
这种方式不仅能提升上传速度,还能避免因网络波动导致的上传失败,同时降低服务器内存压力。
内容的提问来源于stack exchange,提问作者peacemaker
相关产品推荐
相关产品推荐

