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

使用laravel-excel与Laravel队列导入100万行Excel数据失败求助

解决Laravel-Excel大文件导入Nginx超时问题

你的问题核心是当前代码没实现真正的异步处理:Excel::import()会同步把100万行数据全加载到内存,再丢给队列——这一步就已经超出Nginx的连接超时限制了,改PHP执行时间没用,因为Nginx自身有独立的超时规则。

下面是具体解决步骤:

1. 改用Laravel-Excel自带的队列分片导入

不要手动dispatch队列,用包原生的队列导入功能,它会分片读取文件,避免一次性加载全量数据:

修改LeadsImport类

让类实现WithChunkReading和ShouldQueue接口,指定单次处理的行数:

use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Illuminate\Contracts\Queue\ShouldQueue;

class LeadsImport implements ToCollection, WithChunkReading, ShouldQueue
{
    // 每次处理1000行,可根据服务器配置调整(比如500或2000)
    public function chunkSize(): int
    {
        return 1000;
    }

    public function collection(Collection $rows)
    {
        // 在这里处理单批行数据,比如批量插入数据库
        foreach ($rows as $row) {
            // 你的业务逻辑示例:
            // Lead::create([
            //     'col1' => $row[0],
            //     'col2' => $row[1],
            //     // ... 对应50列的字段
            // ]);
        }
    }
}

修改控制器代码

直接用queueImport方法,包会自动把分片任务推送到队列:

public function import(Request $request)
{
    Excel::queueImport(new LeadsImport, $request->file);
    
    return response()->json(['message' => '导入任务已提交,将在后台处理']);
}

2. 调整Nginx超时配置

修改你的Nginx站点配置文件,延长超时时间(比如设置为300秒):

server {
    # 其他原有配置...
    
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;
}

修改后重启Nginx:sudo systemctl restart nginx

3. 优化服务器和队列运行配置

  • 确保队列Worker正常运行:执行php artisan queue:work,生产环境推荐用Supervisor管理Worker,防止进程意外退出
  • 调高PHP内存限制:在php.ini中设置memory_limit = 256M(或更高,根据服务器内存调整)
  • 优先用CSV文件导入:XLSX解析比CSV更耗资源,大文件转成CSV能降低解析压力

内容的提问来源于stack exchange,提问作者Md. Mostafijur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:30:49