必须先安装topthink/think-queue ^3.0扩展,thinkphp6/8的think\queue仅含接口无驱动逻辑,不安装则php think queue:listen等命令无法执行;配置文件为config/queue.php,default值须与connections下键名严格一致,redis驱动需设type=>'redis'且启用php-redis扩展。

topthink/think-queue 不装就根本跑不起来队列命令——这是最常被忽略的前提。ThinkPHP 6 和 8 的 think\queue 命名空间下只有接口和基类,所有实际驱动(redis、database、sync)都由该扩展提供。
必须先装 topthink/think-queue 才能用队列命令
运行 php think queue:listen 报错 “Command not found” 或卡住不动?大概率是没装扩展。composer require topthink/think-queue ^3.0(TP6 对应 v3;TP8 同样适用,但需额外在 app/provider.php 中注册 think\queue\ServiceProvider::class)。
别试 ^2.0,它不兼容 TP6+ 的容器和事件机制。
装完检查 vendor/topthink/think-queue 是否存在,否则 composer 可能因网络或镜像问题静默失败。
config/queue.php 配置里最容易写错的三处
配置文件路径固定为 config/queue.php,且必须返回数组;常见错误不是语法错,而是键名逻辑错:
• 'default' => 'redis' 必须与 'connections' => ['redis' => [...]] 中的键名完全一致,不能写成 'redis_driver' 或 'redis_queue'
• 'connections.redis.type' => 'redis'(不是 driver),这个 type 是驱动识别的关键字段
• Redis 配置中 'select' => 0 是数据库编号(对应 Redis 的 SELECT 命令),不是 'database';设 'timeout' => 0 表示永不超时,生产环境建议设为 3 或 5
任务类的 fire() 还是 handle()?
ThinkPHP 6 默认用 fire(Job $job, $data);TP8 开始官方文档倾向 handle(),但两者都支持,关键看你怎么注册和调用:
• 若用 Queue::push('App\Job\SendMail', $data),类里必须有 fire()
• 若用 Queue::push(new SendMail($data)),类里必须有 handle()
• 无论哪种,都得显式调 $job->delete()(fire 方式)或 $this->delete()(handle 方式),否则任务会不断重试
• 构造函数里别做重操作:worker 进程反序列化时若抛异常,任务直接被跳过,表里 attempts 一直为 0
php think queue:listen 启动失败的典型表现和查法
命令无日志、CPU 占用低、任务进表但不消费?重点排查:
• 没加 --queue=mail 却在代码里指定了非默认队列名,例如 Queue::push(..., 'mail'),监听时却只跑 php think queue:listen(它只监听 default)
• Redis 连接参数中 'password' => ''(空字符串)和 'password' => null 效果不同,后者会导致认证失败但不报错
• Linux 下用 php think queue:listen 启动后关终端,进程会被 SIGINT 终止;务必用 supervisor 管理,或加 & + nohup
• Windows 下 cmd 窗口关闭等于杀进程,别直接点叉
redis.default.queue 这个配置项容易被忽略——多个 ThinkPHP 应用共用一个 Redis 实例时,不设它就会全挤在 default 队列里互相干扰。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











