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

Laravel Redis队列不稳定:部分任务未执行即终止求助

解决Laravel队列Worker未执行任务就终止的问题

针对你遇到的Ubuntu 20.x + Redis 5.x环境下,Laravel队列Worker偶尔未执行任务就终止的情况,可按以下方向排查解决:

  • 检查系统OOM Killer记录
    当--timeout=0时,Worker进程可能因内存占用过高被系统OOM Killer强制杀死,这类操作不会被Laravel或Redis日志捕获。执行以下命令查看系统日志:

    grep -i oom /var/log/syslog
    # 或
    dmesg | grep -i kill
    

    如果发现Worker进程被标记为Out of memory,说明是内存溢出导致的进程终止。

  • 限制Worker内存并启用自动重启
    Laravel Worker默认无内存限制,长期运行可能出现内存泄漏。修改启动命令,添加内存限制和自动重启参数:

    php artisan queue:work --timeout=0 --tries=2 --memory=128 --max-jobs=1000
    
    • --memory=128:限制Worker进程最大内存为128MB(可根据实际调整)
    • --max-jobs=1000:Worker处理1000个任务后自动重启,避免内存泄漏累积
      也可使用--max-time=3600让Worker运行1小时后自动重启。
  • 优化Redis连接配置
    即使日志无异常,Redis连接意外断开也可能导致Worker终止。修改config/database.php中的Redis配置,添加超时和持久化参数:

    'redis' => [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 0),
            'timeout' => 60,
            'read_timeout' => 60,
            'persistent' => true,
        ],
    ],
    
  • 排查任务隐性错误
    部分任务可能触发PHP致命错误但未被Laravel日志捕获,可:

    1. 在任务的handle方法中手动添加日志记录,跟踪任务执行流程:
      public function handle()
      {
          Log::info('开始执行任务:'.self::class);
          // 任务逻辑
          Log::info('任务执行完成:'.self::class);
      }
      
    2. 查看PHP错误日志(路径通常为/var/log/php7.4-fpm.log或对应PHP版本的日志文件),检查是否有未被捕获的错误信息。
  • 使用Supervisor管理Worker进程
    直接通过命令启动的Worker,在终端关闭或进程意外退出后无法自动恢复。用Supervisor监控Worker,确保进程异常时自动重启:
    创建Supervisor配置文件/etc/supervisor/conf.d/laravel-worker.conf,内容如下:

    [program:laravel-worker]
    process_name=%(program_name)s_%(process_num)02d
    command=php /path/to/your/project/artisan queue:work redis --timeout=0 --tries=2 --memory=128 --max-jobs=1000
    autostart=true
    autorestart=true
    user=www-data
    numprocs=4
    redirect_stderr=true
    stdout_logfile=/path/to/your/project/storage/logs/worker.log
    

    然后更新Supervisor配置并启动:

    supervisorctl reread
    supervisorctl update
    supervisorctl start laravel-worker:*
    

内容的提问来源于stack exchange,提问作者Phạm Tiến Hải

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:54:31