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日志捕获,可:- 在任务的
handle方法中手动添加日志记录,跟踪任务执行流程:public function handle() { Log::info('开始执行任务:'.self::class); // 任务逻辑 Log::info('任务执行完成:'.self::class); } - 查看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
相关产品推荐
相关产品推荐

