Yii3.0异步队列任务配置指南【RabbitMQ】

冬伟大大_7937

冬伟大大_7937

2026-08-09

363人浏览

原创

yii 3.0 中需手动集成 php-amqplib v3.6+ 实现 rabbitmq 异步任务,配置连接参数、编写可序列化任务类、封装发布/消费逻辑,并通过 di 容器注入连接实例启动消费者。

yii3.0异步队列任务配置指南【rabbitmq】

在 Yii 3.0 中启用 RabbitMQ 异步任务,必须绕过框架默认的同步执行模型,手动集成 AMQP 客户端并构建可调度、可重试、带事务边界的任务生命周期——这不像 Yii 2.x 那样有内置 queue 组件,也没有 yiiqueuerabbitmq 扩展可用。

安装 RabbitMQ 客户端与依赖

执行 composer 命令安装官方推荐的 amqp 扩展:composer require php-amqplib/php-amqplib。

该扩展是 PHP 生态中事实标准的 AMQP 1.0 实现,支持 RabbitMQ 3.10+ 及所有主流插件(如 shovel、federation),【不兼容旧版 php-amqplib v2.x】,务必确认安装的是 v3.6+ 版本。

验证安装:运行 php -r "echo class_exists('PhpAmqpLib\Connection\AMQPStreamConnection') ? 'OK' : 'FAIL';",输出 OK 即表示扩展加载成功。

配置 RabbitMQ 连接参数

在 config/common.php 或独立的 config/rabbitmq.php 中定义连接配置:

[ 'rabbitmq' => [ 'host' => $_ENV['RABBITMQ_HOST'] ?? 'localhost', 'port' => (int)($_ENV['RABBITMQ_PORT'] ?? 5672), 'user' => $_ENV['RABBITMQ_USER'] ?? 'guest', 'password' => $_ENV['RABBITMQ_PASS'] ?? 'guest', 'vhost' => $_ENV['RABBITMQ_VHOST'] ?? '/', 'exchange' => 'default.exchange', 'queue' => 'default.queue', ] ]

注意:vhost 必须已由管理员创建并授权给指定用户,否则连接会静默失败;【RabbitMQ 默认 vhost 是 /,但生产环境严禁使用 guest/guest 登录】。

编写可序列化的任务类

创建 src/Queue/Task/SendEmailTask.php:

namespace AppQueueTask; use YiisoftSerializerSerializerInterface; use YiisoftDiContainer; final class SendEmailTask { private string $to; private string $subject; private string $body; public function __construct(string $to, string $subject, string $body) { $this->to = $to; $this->subject = $subject; $this->body = $body; } public function execute(Container $container): void { $mailer = $container->get(AppMailer::class); $mailer->send($this->to, $this->subject, $this->body); } }

这个类必须满足三个硬性条件:① 构造函数参数全为标量或可序列化对象;② 不含闭包、资源、PDO 实例等不可序列化成员;③ execute 方法接收 Container 实例而非全局 Yii::$app。

封装消息发布与消费逻辑

方法一:手写 Publisher 类

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

在 src/Queue/Publisher.php 中实现:

use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; use YiisoftSerializerJsonSerializer; final class Publisher { private AMQPStreamConnection $connection; private JsonSerializer $serializer; public function __construct(AMQPStreamConnection $connection, JsonSerializer $serializer) { $this->connection = $connection; $this->serializer = $serializer; } public function publish(object $task): void { $channel = $this->connection->channel(); $channel->queue_declare('default.queue', false, true, false, false); $data = $this->serializer->serialize($task); $msg = new AMQPMessage($data, [ 'delivery_mode' => 2, ]); $channel->basic_publish($msg, '', 'default.queue'); $channel->close(); } }

方法二:用 DI 容器自动注入连接实例

在 config/di.php 中绑定:

return [ PhpAmqpLibConnectionAMQPStreamConnection::class => [ 'class' => PhpAmqpLibConnectionAMQPStreamConnection::class, '__construct()' => [ $_ENV['RABBITMQ_HOST'], (int)$_ENV['RABBITMQ_PORT'], $_ENV['RABBITMQ_USER'], $_ENV['RABBITMQ_PASS'], $_ENV['RABBITMQ_VHOST'], ], ],];

这样 Publisher 构造时就能自动获得已配置的连接实例,避免每次手动 new。

启动消费者进程

第一步:创建 bin/consume-rabbitmq 可执行脚本(chmod +x):

#!/usr/bin/env php <?php require __DIR__ . '/../vendor/autoload.php'; use AppQueueConsumer; use YiisoftDiContainer; $container = new Container(require __DIR__ . '/../config/di.php'); $consumer = $container->get(Consumer::class); $consumer->run();

第二步:在 src/Queue/Consumer.php 中实现监听循环:

use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibChannelAMQPChannel; use YiisoftSerializerJsonSerializer; use YiisoftDiContainer; final class Consumer { private AMQPStreamConnection $connection; private JsonSerializer $serializer; private Container $container; public function __construct(AMQPStreamConnection $connection, JsonSerializer $serializer, Container $container) { $this->connection = $connection; $this->serializer = $serializer; $this->container = $container; } public function run(): void { $channel = $this->connection->channel(); $channel->queue_declare('default.queue', false, true, false, false); $callback = function ($msg) { try { $task = $this->serializer->unserialize($msg->getBody(), AppQueueTaskSendEmailTask::class); $task->execute($this->container); $msg->ack(); } catch (Throwable $e) { $msg->nack(); throw $e; } }; $channel->basic_consume('default.queue', '', false, false, false, false, $callback); while ($channel->is_consuming()) { $channel->wait(); } $channel->close(); $this->connection->close(); } }

第三步:在终端运行 php bin/consume-rabbitmq 启动常驻进程。该进程会持续拉取消息、反序列化、执行任务并确认应答。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

524

5

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

2026.01.28

708

20

RabbitMQ使用教程合集
RabbitMQ使用教程合集

RabbitMQ使用教程合集整理 RabbitMQ 基础教程、消息队列开发案例、生产者消费者、交换机与队列实战内容。

2026.05.20

164

15

RabbitMQ集群部署指南
RabbitMQ集群部署指南

RabbitMQ集群部署指南聚合 RabbitMQ 集群部署、高可用架构、镜像队列、故障恢复、监控与运维优化内容。

2026.05.20

117

12

RabbitMQ Docker实战指南
RabbitMQ Docker实战指南

RabbitMQ Docker实战指南提供 RabbitMQ Docker 镜像部署、Docker Compose、Kubernetes Operator 与云原生实践教程。

2026.05.20

122

10

PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2810

22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

80

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.2万人学习