Laravel设置QUEUE_CONNECTION=database后队列入库但不执行如何解决
Laravel database队列驱动不执行问题修复方案
核心原因
sync驱动为同步执行模式,任务会在当前请求进程内直接运行,无需额外启动消费进程;而database等异步驱动需要单独启动队列工作进程,才会主动消费jobs表中存储的任务。
修复步骤
1. 基础配置校验
- 确认已生成队列所需表结构,未执行的话先运行以下命令:
php artisan queue:table php artisan migrate
- 清除配置缓存,确保.env中的
QUEUE_CONNECTION=database配置生效:
php artisan config:clear
2. 临时测试队列消费
前台启动队列工作进程,测试任务是否可以正常消费,执行后窗口不要关闭,派发新任务即可看到执行日志:
php artisan queue:work
如果测试阶段任务正常执行,说明配置没有问题,接下来配置后台常驻运行即可。
3. 配置后台常驻运行
本地开发临时后台运行
可以直接将进程挂到后台执行:
nohup php artisan queue:work --daemon >> storage/logs/queue.log 2>&1 &
生产环境稳定运行
推荐使用Supervisor管理队列进程,保证进程意外退出后自动重启:
- 安装Supervisor
# Debian/Ubuntu系统 apt install supervisor # CentOS/RHEL系统 yum install supervisor
- 新增队列进程配置文件
/etc/supervisor/conf.d/laravel-queue.conf,内容参考:
[program:laravel-queue] process_name=%(program_name)s_%(process_num)02d command=php /你的项目绝对路径/artisan queue:work --sleep=3 --tries=3 --max-time=3600 autostart=true autorestart=true stopasgroup=true killasgroup=true user=运行项目的系统用户(比如www-data) numprocs=1 redirect_stderr=true stdout_logfile=/你的项目绝对路径/storage/logs/queue.log stopwaitsecs=3600
- 加载配置并启动进程
supervisorctl reread supervisorctl update supervisorctl start laravel-queue:*
常见问题排查
- 若启动进程后任务仍未消费:检查派发任务时是否指定了非
default的自定义队列名,若是则启动队列进程时需要加上--queue=你的队列名参数 - 若任务进入failed_jobs表:查看失败日志确认任务代码本身的逻辑错误,修改代码后执行
php artisan queue:restart重启队列进程生效(队列daemon模式会常驻内存,不会自动加载新代码) - 若任务在事务内派发:可以将
queue.php中database连接的after_commit参数改为true,保证事务提交后再将任务入队,避免事务回滚后任务仍被消费的问题
内容的提问来源于stack exchange,提问作者dinkelberg
相关产品推荐
相关产品推荐

