<p>直接安装 yiisoft/yii2-queue 易因 PHP 版本、Yii 核心版本(需 2.0.40+)及驱动扩展(如 predis/predis 或 phpredis)不匹配而报错;旧项目应选 yii2tech/queue 或锁定 2.2.* 版本。</p>

yii2-queue 扩展怎么装才不踩 Composer 依赖坑
直接装 yiisoft/yii2-queue 很可能报错,因为它的最低 PHP 版本、Yii 核心版本和驱动扩展(如 ext-pdo、ext-redis)要求没对齐。
- Yii 2.0.40+ 才支持
yiisoft/yii2-queue2.3+;旧项目用yii2tech/queue或锁死yiisoft/yii2-queue:2.2.* - Redis 驱动必须装
predis/predis或phpredis扩展,只装包不装扩展会卡在Unknown driver "redis" - 数据库驱动需额外启用
yii\queue\db\Queue,但默认 migration 不会自动跑,得手动执行yii queue/migrate
任务类里 handle() 方法为什么总不执行
不是写了 handle() 就能进——它只在「被队列 worker 拉取并执行时」触发,且有严格签名和上下文限制。
-
handle()必须是 public,不能带类型声明(比如public function handle(Job $job)在 PHP 7.4+ 会因反序列化失败静默跳过) - 任务对象必须可序列化:避免闭包、
$this->db这类资源属性;推荐用 ID 查库,而不是传 AR 实例 - 如果用 DB 驱动,任务类名变更后未更新数据库里的
job表job字段,反序列化失败也不报错,只会卡在 reserved 状态
runWorker 命令卡住或秒退的常见原因
yii queue/listen 或 yii queue/run 看似启动了,实际没干活,基本是配置或权限问题。
- CLI 环境和 Web 环境的
config/console.php和config/web.php队列配置不一致——worker 只读 console 配置 - Redis 连接超时未设,网络抖动时
listen直接 exit;加--ttr=300和--sleep=3更稳 - DB 驱动下,MySQL 的
wait_timeout小于 worker 运行周期,连接断开后不重连,后续任务全失败
延迟任务和优先级在不同驱动下表现差异大
push() 的 $delay 和 $priority 参数不是所有驱动都支持,强行传了也无效。
- Redis 驱动支持
$delay(转成 ZSET score),但$priority被忽略;DB 驱动两者都支持,但 priority 仅影响 SELECT ORDER BY,无抢占机制 - Beanstalkd 驱动支持完整语义,但需要服务端开启
-b参数,且 PHP 客户端pda/pheanstalk要 >= 4.0 - 别在
push()里传时间戳当$delay——它要的是秒数,传 1698765432 会导致任务 53 年后才执行
真正麻烦的是跨环境一致性:本地用 DB 驱动调试方便,上生产切 Redis 后,延迟逻辑、失败重试次数、甚至 job 序列化格式都可能不兼容。改驱动前,先跑通一个带 delay + fail + retry 的端到端链路。


















