You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:27:03