Laravel订单系统文件上传后重定向出现连接超时问题排查
排查短时间多次文件上传后出现ERR_CONNECTION_TIME_OUT的问题
可能遗漏的排查方向
1. 浏览器并发请求限制
浏览器对同一域名的并发HTTP请求数有默认限制(如Chrome、Firefox默认是6个)。短时间内连续触发上传+页面刷新的操作,会导致多个请求排队等待,超出浏览器等待时长后就会抛出连接超时错误。
2. Laravel会话锁阻塞
Laravel默认使用文件存储Session,且在请求处理期间会锁定Session文件。如果短时间内发起多个请求(比如上传请求未完成就触发页面刷新),后续请求会等待前一个请求释放Session锁,若等待时间超过浏览器超时阈值,就会出现连接超时。
3. Apache连接数与KeepAlive配置
- 检查Apache的
MaxRequestWorkers(或旧版本的MaxClients)设置,若短时间内请求数超过该值,新请求会被拒绝或排队超时。 - 查看
KeepAliveTimeout参数,若设置过长,闲置连接不会及时释放,导致可用连接数耗尽。
4. 服务器TCP连接状态异常
使用netstat -an | grep TIME_WAIT查看服务器上的TIME_WAIT连接数,若数量过多,会占用大量端口资源,导致新的TCP连接无法建立,触发连接超时。
5. 文件系统IO瓶颈
多次上传文件到同一目录,若服务器磁盘IO性能不足(比如机械硬盘、磁盘空间不足),文件写入过程会变慢,虽然最终文件能上传成功,但服务器响应返回延迟,超出浏览器的连接等待时间。
针对性优化建议
优化Session锁问题
如果上传接口不需要使用Session数据,可以在控制器中提前释放Session锁:
public function UploadOrderFile(Request $request) { // 提前保存并释放Session锁 $request->session()->save(); $data = $request->all(); $file = $request->file('global_file'); $basepath = base_path(); $destinationPath = $basepath.'/orders/'.$data['tm_num']; $fileName = $file->getClientOriginalName(); $file->move($destinationPath,$fileName); return response()->json(['status' => 'success']); }
避免页面强制刷新
将AJAX成功后的页面刷新改为动态更新DOM,减少不必要的页面请求,降低并发压力:
$.ajax({ type: "POST", url: '/admin/order/upload', data: fd, processData: false, contentType: false, success: function (res) { // 示例:动态添加已上传文件的列表项 $('#file-list').append(`<li>${fd.get('global_file').name}</li>`); // 清空文件输入框 $('input[name=global_file]').val(''); }, error: function(xhr, status, error) { // 处理错误,比如提示用户文件已上传 alert('文件已成功上传'); } });
限制重复上传触发
给上传按钮添加状态锁,避免用户短时间内多次点击:
$("#upload").on("click", function() { const $btn = $(this); // 如果按钮处于禁用状态,直接返回 if ($btn.prop('disabled')) return; // 禁用按钮 $btn.prop('disabled', true).text('上传中...'); var files = $('input[name=global_file]')[0].files; if (!files.length) { $btn.prop('disabled', false).text('上传'); alert('请选择文件'); return; } var fd = new FormData(); fd.append('global_file',files[0]); fd.append('tm_num', {{ $order['tm_num'] }}); $.ajax({ type: "POST", url: '/admin/order/upload', data: fd, processData: false, contentType: false, success: function () { // 动态更新页面或刷新(推荐动态更新) window.location.reload(); }, complete: function() { // 请求完成后恢复按钮状态 $btn.prop('disabled', false).text('上传'); } }); });
调整Apache配置
修改Apache的连接相关参数(需重启Apache生效):
MaxRequestWorkers:根据服务器CPU和内存适当调高(比如200-500,具体看服务器配置)KeepAliveTimeout:缩短为5-10秒,减少闲置连接占用MaxKeepAliveRequests:设置为100左右,避免单个连接处理过多请求
内容的提问来源于stack exchange,提问作者Mikelo
相关产品推荐
相关产品推荐

