根本原因是TP7移除think-queue默认集成,需手动安装topthink/think-queue扩展并严格匹配驱动类名与config/queue.php配置;Redis驱动需正确定义connections.redis且default设为'redis',Database驱动需建jobs表并配置database连接,Sync驱动仅用于同步调试。

ThinkPHP7项目中消息队列始终不消费任务,或执行php think queue:listen报“Connection refused”“Driver [xxx] not supported”,根本原因是驱动未在config/queue.php中正确定义或default指向错误——TP7已移除对think-queue的默认集成,必须手动安装扩展并严格匹配驱动类名与配置键。
安装并启用think-queue扩展
ThinkPHP7不再内置队列组件,需显式引入官方维护的topthink/think-queue包。该包兼容TP7,但仅支持Redis、Database、Sync三类驱动,不包含RabbitMQ等第三方驱动。
执行命令安装:composer require topthink/think-queue
安装完成后,检查vendor/topthink/think-queue/src/connector目录是否存在Redis.php【必须存在,否则后续配置无效】;若缺失,说明Composer安装失败或版本不匹配,需强制指定版本:composer require topthink/think-queue:^3.0(适配TP7)。
立即学习“PHP免费学习笔记(深入)”;
这一步操作起来很简单,直接把命令粘贴进终端回车就行。
配置Redis驱动(推荐)
Redis驱动是TP7队列的首选方案,具备原子性出队、低延迟和高吞吐优势,适用于短信发送、订单异步处理等典型场景。
第一步:在config/queue.php中定义connections.redis配置块,内容如下:
'redis' => [<br> 'type' => 'redis',<br> 'host' => '127.0.0.1',<br> 'port' => 6379,<br> 'password' => '',<br> 'select' => 0,<br> 'timeout' => 0,<br> 'persistent' => false,<br> 'queue' => 'default'<br>],
第二步:将default值设为'redis',确保所有未显式指定连接的任务都走Redis通道。
第三步:确认PHP已启用redis扩展——运行php -m | grep redis,输出为空则需安装扩展并重启PHP服务,否则队列监听器启动即报错。
注意:select必须为整数类型(如0),写成字符串"0"会导致连接失败且无明确报错提示。
切换Database驱动(无Redis环境)
当服务器无法部署Redis时,Database驱动可复用现有MySQL连接,适合开发验证或轻量级部署。
方法一:自动生成jobs表
执行命令:php think queue:table。该命令会创建jobs和failed_jobs两张表,字段含job、attempts、reserved_at、available_at等。
方法二:手动建表
若命令执行失败或需自定义表名,在MySQL中执行建表SQL:CREATE TABLE `jobs` (`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `job` TEXT NOT NULL, `attempts` TINYINT UNSIGNED NOT NULL, `reserved_at` INT UNSIGNED NULL, `available_at` INT UNSIGNED NOT NULL, `created_at` INT UNSIGNED NOT NULL);
配置connections.database块:'database' => ['type' => 'database', 'table' => 'jobs', 'queue' => 'default'],并将default改为'database'。
【关键前提】确保config/database.php中默认数据库连接已配置且可连通,Database驱动完全复用该连接,不单独校验。
启用Sync驱动快速调试
Sync驱动不依赖任何外部服务,所有任务在当前HTTP请求内同步执行,专用于验证Job类语法是否正确、fire()方法能否正常运行。
只需在config/queue.php中将default设为'sync',其余配置可全部删除或注释。
投递任务后立即返回结果,无需启动监听器,也不产生任何队列表记录。
这一步做完,你就能立刻看到任务执行日志,不用等后台进程拉起。



















