Laravel集成Resumable.js上传大文件失败且服务器响应缓慢问题求助
上传耗时过高、TTFB随进度上涨优化方案
- 调整前端分片参数
- 将分片大小从1024KB上调至5~10MB,9.6GB文件使用10MB分片仅需984次请求,较1MB分片的9830次减少90%的请求往返开销,能直接缩短一半以上的上传耗时。
- 把Resumable配置中的
throttleProgressCallbacks从1调整为0.3~0.5,降低进度回调的触发频率,减少不必要的接口请求。 - 开启
testChunks: true,启用分片已上传校验,避免网络波动导致的重复分片上传,也支持断点续传时跳过已上传的分片。 - 新增
chunkSize: 10 * 1024 * 1024、simultaneousUploads: 5配置,分别设置分片大小为10MB、并发上传数为5,根据服务器性能可将并发数调整到5~8,进一步提升上传吞吐量。
- 优化后端分片校验逻辑
你当前使用的FileReceiver默认会在每次分片上传时遍历磁盘上的所有已上传分片来判断上传进度,分片数量过万时磁盘IO遍历耗时会大幅上涨,这是TTFB随上传进度持续升高的核心原因。可以改用Redis存储已上传分片的哈希标记,每次校验直接从Redis读取,无需遍历磁盘文件,可将TTFB稳定控制在300ms以内。 - 调整服务基础配置
开启Apache的KeepAlive配置,减少TCP三次握手的重复开销;开启PHP的OPcache扩展,降低PHP脚本每次请求的初始化损耗。
上传完成返回500、分片未合并解决方案
1GB以内文件上传正常是因为分片数量少,合并耗时短,没有触碰到服务默认的超时、内存限制,大文件场景下需要调整以下配置和逻辑:
- PHP配置调整(
php.ini)max_execution_time = 0:关闭脚本最大执行时间限制,避免大文件合并时脚本超时终止;也可以仅在上传控制器方法开头添加set_time_limit(0),无需全局修改。memory_limit = 512M:提升内存上限,避免合并分片时读取文件内容超出内存限制触发报错。- 确认
upload_tmp_dir所在磁盘剩余空间大于2倍的待上传最大文件大小,避免临时文件存储空间不足报错。
- Apache配置调整(
httpd.conf)Timeout 600:将默认60秒的请求超时改为600秒,给大文件合并留出足够的执行时间。KeepAliveTimeout 60:提升长连接超时时间,减少重复连接开销。
- 代码逻辑优化
你当前的逻辑是所有分片上传完成后一次性合并,大文件合并耗时过长,可改为边传边合并:每收到一个分片就直接追加到目标文件末尾,所有分片上传完成后直接返回结果,无需额外合并步骤,能完全避免合并超时的问题。
内容的提问来源于stack exchange,提问作者wpcpremium80
相关产品推荐
相关产品推荐

