Laravel队列任务入数据库但未执行,说明分发成功而worker未运行或配置错误:需检查queue:work进程状态、连接/队列参数、Supervisor状态、环境配置及驱动初始化问题。

队列任务进了数据库但没执行
说明 Laravel 已成功分发任务,但 queue:work 进程没在跑,或没监听对应连接/队列名。
- 检查进程是否存活:
ps aux | grep queue:work,确认有正在运行的 worker(注意别只看到grep自己) - 确认启动命令指定了正确连接和队列:比如用 Redis 时要加
--connection=redis,指定队列名要用--queue=emails,default - 如果用 Supervisor 管理,检查
supervisorctl status输出是否为RUNNING,不是STOPPED或ERROR - 开发环境常用错:直接执行
php artisan queue:work后关掉终端,进程就退出了——得加--daemon(Laravel 9+ 默认启用)或改用queue:listen(已弃用,不推荐)
日志里报 Connection refused 或 Class not found
前者是队列驱动连不上服务,后者是反序列化失败,两者都导致任务卡住不动。
-
Connection refused多见于 Redis/Memcached 配置错误:检查.env中QUEUE_CONNECTION和REDIS_HOST/REDIS_PORT是否匹配实际服务地址;Docker 环境尤其注意不能写localhost,得用宿主别名如redis -
Class not found通常因为任务类被删、命名空间改了,或部署后没跑composer autoload-dump;也可能是队列任务用了闭包(Laravel 不支持序列化闭包) - 临时验证方式:手动触发一次任务,然后立刻查
failed_jobs表,看exception字段里的完整错误堆栈
queue:work 启动后立刻退出,没报错
这是典型的配置或权限问题,表面静默,实则无法初始化队列驱动。
- 检查
config/queue.php中当前连接的connection配置项是否存在,比如设成了database却没配connections.database的table和retry_after - 运行
php artisan tinker,执行resolve(\Illuminate\Queue\QueueManager::class)->connection(),看是否抛异常——能快速暴露驱动初始化失败点 - 某些共享主机或 SELinux 环境会拦截 Redis socket 连接,表现为无日志、无输出、进程秒退;可临时切到
sync驱动测试是否逻辑层正常
任务执行了但没按预期更新状态或发请求
说明 worker 进程在跑、任务也消费了,但业务逻辑出问题,容易误判为“没执行”。
- 务必打开队列日志:在
config/logging.php中确保stackchannel 包含stderr或文件驱动,并在queue配置里设'log' => 'debug'(Laravel 10+ 支持) - 任务内不要依赖
$request或 session,worker 是无上下文的长生命周期进程,所有数据必须显式传入构造函数或handle()参数 - 数据库事务中分发任务要小心:如果事务未提交就分发,worker 拿到的是旧快照;用
afterCommit()显式声明等待事务完成
最常被忽略的是环境一致性:.env 里 QUEUE_CONNECTION 和 APP_ENV 在部署后是否被覆盖,以及 config:cache 是否清除了旧队列配置。改完配置不重跑 config:clear,worker 就永远读不到新设置。










