ThinkPHP8切换think-queue+Redis失败,本质是队列未真正走Redis而仍用sync模式;需确认redis扩展启用、Redis服务可达、已安装think-queue,并严格配置config/queue.php中default和type为小写'redis'、select为整数、password显式为空,再通过dump(config('queue.default'))和redis-cli KEYS default验证生效。

ThinkPHP8 切换到 think-queue + Redis 驱动失败,通常不是“换不上去”,而是配置未真正生效或环境没对齐。核心问题在于:队列根本没走 Redis,还在用默认的 sync(同步)模式。下面分四块说清楚怎么配、怎么验、怎么避坑。
确认基础依赖已就位
没这三样,后面全白搭:
- PHP 必须启用
redis扩展(不是predis),运行php -m | grep redis要有输出 - Redis 服务必须运行且可连,执行
redis-cli -h 127.0.0.1 -p 6379 ping返回PONG - 项目已安装
topthink/think-queue:运行composer require topthink/think-queue
config/queue.php 配置要点
这个文件是唯一入口,TP8 不读 .env 里的队列参数。重点检查这几项是否写对:
-
'default' => 'redis'—— 必须是小写字符串,不能是'Redis'或变量 -
'connections' => ['redis' => [...]]中的'type' => 'redis'同样必须小写 -
'host'、'port'、'password'、'select'要和你实际 Redis 实例完全一致;'select'必须是整数(如1),不能写成字符串"1" - 密码为空时,显式写
'password' => '',别省略或留 null
验证是否真走 Redis 驱动
别只看配置文件,要动手验证:
立即学习“PHP免费学习笔记(深入)”;
- 运行
php think env:get QUEUE_CONNECTION,确认输出是redis(这个值只是参考,最终以 config/queue.php 为准) - 临时加一行测试代码:
dump(config('queue.default'));,看输出是不是'redis' - 推送一个任务后,直接用
redis-cli查:执行KEYS *default*,如果看到类似queues:default的 key,说明任务已进 Redis;没看到,说明压根没走 Redis 驱动
常见静默失效场景
这些情况不会报错,但队列永远不工作:
- config/queue.php 文件路径错误(比如放在 application/extra/ 下,TP8 不认)
- 配置数组键名拼错,例如写成
'driver'而不是'type',或漏掉'connections'外层结构 - Redis 连接参数正确但
'select'指向了一个被禁用的 DB(如 Redis 配置了maxmemory-policy noeviction且 DB 已满) - 使用了 Docker 或远程 Redis,
'host'还写127.0.0.1,应改为宿主机 IP 或host.docker.internal



















