yii 2.0 和 yii 3.0 队列配置差异显著:2.0 依赖 bootstrap 注册及双环境(web/console)独立配置,使用 yiisoft/yii2-queue;3.0 基于 psr-14 和 di 容器,统一通过 container 定义,使用 yiisoft/yii-queue 及对应驱动扩展,配置位置、组件注册、命令语法、重试机制和延时写法均不兼容。

Yii 2.0 和 Yii 3.0 的队列配置差异较大,不是简单升级就能复用——核心在于架构分层和组件注册方式变了。下面按版本分开说清楚,重点讲怎么配、容易错哪、怎么验证。
Yii 2.0 队列配置(主流是 zhuravljov/yii2-queue)
它依赖 bootstrap 注册 + 分开配置 web 和 console 环境:
- 先装扩展:
composer require --prefer-dist yiisoft/yii2-queue - 在
console/config/main.php和web/config/main.php都要加配置(缺一不可,否则命令不识别或 push 失败) - 数据库驱动示例(推荐开发/低频用):
return [
'bootstrap' => ['queue'],
'components' => [
'queue' => [
'class' => \yii\queue\db\Queue::class,
'db' => 'db',
'tableName' => '{{%queue_api}}', // 别用默认名,防冲突
'channel' => 'api',
'mutex' => \yii\mutex\RedisMutex::class, // 换 Redis 锁,别用 MysqlMutex
'ttr' => 120,
'attempts' => 3,
],
],
]; - Redis 驱动更推荐(高并发首选):
'queue' => [
'class' => \yii\queue\redis\Queue::class,
'redis' => 'redis', // 要提前配好 redis 组件
'channel' => 'default',
'ttr' => 180,
'attempts' => 3,
], - 配完执行迁移建表:
php yii queue/migrate(DB 驱动必需) - 命令行运行:
php yii queue/listen或php yii queue/run
Yii 3.0 队列配置(官方 yii-queue 扩展,基于 PSR-14 和依赖注入)
不再靠 bootstrap,改用 DI 容器注册,配置集中到 config/web.php 和 config/console.php 的 container 或 components 中:
- 安装:
composer require yiisoft/yii-queue(注意不是 yii2-queue) - 必须同时装对应驱动,比如 Redis:
composer require yiisoft/yii-queue-redis - 配置示例(Redis):
return [
'container' => [
'definitions' => [
\Yiisoft\Yii\Queue\QueueInterface::class => [
'class' => \Yiisoft\Yii\Queue\Redis\Queue::class,
'redis' => \Yiisoft\Redis\ConnectionInterface::class,
'channel' => 'default',
'ttr' => 120,
'attempts' => 3,
],
],
],
]; - Redis 连接需单独定义(如在
config/common.php): 'redis' => [
'class' => \Yiisoft\Redis\Connection::class,
'host' => 'localhost',
'port' => 6379,
'database' => 0,
], - CLI 命令变了:
php yii queue/listen依然可用,但底层是通过QueueWorker实现 - 无内置 migrate 命令,DB 驱动需手动建表或用 Doctrine Migrations
关键区别和避坑点
别以为改个命名空间就能迁移,这些地方最容易出错:
- 配置位置不同:2.0 要双环境都配;3.0 主要在 container,web 和 console 共享同一份定义
-
锁机制默认行为:2.0 的 DB 队列若还用
MysqlMutex,高并发下会卡住;3.0 默认不带 mutex,得自己注入RedisMutex类 -
任务失败重试逻辑:2.0 依赖抛异常触发;3.0 更严格,要求实现
RetryableJobInterface才支持自定义重试策略 -
延时任务写法:2.0 是
$queue->delay(60)->push($job);3.0 改为$queue->delay(60)->enqueue($job) -
监听进程稳定性:2.0 的
queue/listen可能因内存泄漏缓慢退化;3.0 推荐配合supervisor或systemd管理生命周期
怎么判断配置生效了
别只看命令没报错,实际验证三步:
- 在控制器里执行
Yii::$app->queue->push(new TestJob()),看是否返回整数 ID(2.0)或Promise对象(3.0) - 查 Redis:
llen queue:default或 DB 表queue_api是否有新记录 - 运行监听命令后,看任务类
execute()是否被调用(加日志或断点)











