ThinkPHP 8.0 需通过 topthink/think-queue 扩展实现消息队列,推荐 Redis List 方案;Redis Stream 需手动封装常驻命令;常见问题多源于配置错误或扩展缺失。

用 think-queue 接 Redis 队列(最常用)
这是生产环境主流方案,依赖 Redis 的 List 结构(LPUSH/RPOP),支持延迟、重试、失败记录等基础能力:
- 安装:运行
composer require topthink/think-queue - 配置:在
config/queue.php中指定 Redis 连接参数,关键项包括'type' => 'redis'、'host'、'port'、'select'(推荐独立 DB,如 1 或 2) - 任务类:新建
app/job/CancelOrder.php,实现fire($job, $data)方法(TP8.1+ 支持handle()) - 推送任务:在控制器中调用
Queue::push('app\job\CancelOrder@fire', ['order_id' => 123]) - 启动消费者:执行
php think queue:work --daemon(开发调试),生产环境必须配合 Supervisor 管理进程
想用 Redis Stream?得自己封装
TP8 原生队列不支持 Stream,但如果你需要消费者组、ACK 确认、XPENDING 监控等高级特性,就得手动封装:
- 不能用
queue:work启动,需自建常驻命令(如app/command/StreamConsume.php) - 初始化时检查 stream 和 group 是否存在,用
XGROUP CREATE key groupname 0 MKSTREAM创建 - 生产者调用
$redis->xadd($key, '*', $msg),建议 JSON 编码并带trace_id、retry_count - 消费者必须严格走
XREADGROUP GROUP group consumer COUNT 10 BLOCK 5000 STREAMS key >+XACK+ 异常时XCLAIM流程,否则消息会堆积或丢失
别踩这些坑
很多问题其实出在配置和运维细节上:
-
php think queue:listen命令不存在?检查config/console.php是否注册了\think\queue\Command::class - 消费者频繁退出?确认已启用
pcntl扩展,'persistent' => true并设'timeout' => 30 - 任务推送成功但不消费?核对
config/queue.php中'default'队列名是否与Queue::push()的第三个参数一致 - 延迟任务(如 15 分钟后取消订单)?用
Queue::later(900, ...),底层靠 Redis Sorted Set 实现,无需额外定时器



















