laravel队列不执行的根源多在配置错误:需将queue_connection设为redis或database并清缓存,用supervisor常驻运行queue:work,任务类须实现shouldqueue接口,redis连接需核对redis_变量而非queue_。

队列没跑起来?先确认 QUEUE_CONNECTION 配置对不对
绝大多数 Laravel 队列不执行的问题,根源在环境配置。Laravel 默认用 sync 驱动(同步执行),根本不会进队列,看起来“任务没跑”,其实是压根没走队列逻辑。
必须显式切换为异步驱动,比如 redis 或 database:
-
.env里设QUEUE_CONNECTION=redis(别漏掉redis扩展和phpredis或predis包) - 如果用
database,先运行php artisan queue:table+php artisan migrate,否则会报Base table or view not found: 1146 Table 'xxx.jobs' doesn't exist - 改完
.env后,清缓存:php artisan config:clear(Laravel 不会自动重载 .env 变更)
启动队列监听器:php artisan queue:work 不是“点一下就完事”
这个命令只是前台运行一个 worker 进程,关掉终端就停。生产环境不能这么用。
- 要用
supervisor管理常驻进程(推荐),或systemd;直接后台跑nohup php artisan queue:work &容易漏日志、崩溃不重启 - 加
--tries=3和--timeout=60参数防卡死任务;默认超时 60 秒,但某些任务(如上传、API 调用)可能需要调高 - 开发时可加
--verbose --delay=3看详细日志,延迟重试方便调试失败任务
任务没进队列?检查 dispatch() 调用方式和类结构
常见假象:代码写了 SendEmail::dispatch(),但任务根本没进 Redis 或 jobs 表。
- 确保任务类用了
implements ShouldQueue接口(Laravel 9+ 默认生成的 job 类已带,但手写或旧项目容易漏) - 不要在构造函数里做耗时操作或依赖未初始化服务;
__construct里只能存简单参数,复杂逻辑放handle() - 用
dispatchNow()是同步执行,不进队列;调试时误用会导致“以为进了队列,其实没走” - 如果任务类在
app/Jobs外路径,要确认是否被composer.json的 autoload 自动加载,否则抛class not found
Redis 驱动连不上?看 REDIS_HOST 和 QUEUE_CONNECTION 是否冲突
用 Redis 但队列始终空转,大概率是连接参数错位或权限问题。
-
QUEUE_CONNECTION=redis时,Laravel 会读REDIS_*系列变量,不是QUEUE_*;别把QUEUE_HOST当成 Redis 地址配 - 本地用 docker Redis 时,
REDIS_HOST别填localhost(那是宿主机),得填容器名如redis - Redis 密码不为空时,必须在
REDIS_PASSWORD中设置,且 Laravel 7+ 要求REDIS_URL格式为redis://:password@host:port,否则静默失败
队列真正的难点不在配置,而在“任务失败后有没有进 failed_jobs 表”“重试是否按预期触发”——这些得靠日志和 php artisan queue:failed 去验证,而不是只看控制台有没有输出。