有!PHP 及 Yii2 都有成熟的 RabbitMQ SDK,核心依赖 php-amqplib(PHP 生态最常用的 RabbitMQ 客户端),Yii2 可通过扩展或直接集成该库使用。

一、核心 SDK:php-amqplib

二、Yii2 集成方式(2种方案)

方案1:直接使用 php-amqplib(简单灵活)

1. Yii2 生产者(发消息)
<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class RabbitmqProducerController extends Controller
{
    public function actionSend()
    {
        // 连接RabbitMQ(本地默认配置,远程改host为服务器IP)
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel();

        // 声明队列(持久化)
        $channel->queue_declare('test_queue', false, true, false, false);

        // 消息内容
        $messageBody = 'Yii2 发送的 RabbitMQ 消息';
        $message = new AMQPMessage(
            $messageBody,
            ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT] // 消息持久化
        );

        // 发送消息
        $channel->basic_publish($message, '', 'test_queue');
        echo "消息发送成功:{$messageBody}\n";

        // 关闭连接
        $channel->close();
        $connection->close();

        return '发送完成';
    }
}
2. Yii2 消费者(订阅+主动推送,长期运行)
<?php
namespace app\console\controllers;

use yii\console\Controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class RabbitmqConsumerController extends Controller
{
    public function actionListen()
    {
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel();

        // 与生产者队列一致(持久化)
        $channel->queue_declare('test_queue', false, true, false, false);
        // 预取数:每次只推1条,处理完再推
        $channel->basic_qos(null, 1, null);

        // 消息回调(RabbitMQ主动推送时触发)
        $callback = function ($msg) {
            echo "收到推送消息:{$msg->body}\n";
            $msg->ack(); // 手动确认消息
        };

        // 注册订阅(关闭自动确认)
        $channel->basic_consume('test_queue', '', false, false, false, false, $callback);

        echo "等待接收消息...(按Ctrl+C退出)\n";
        // 客户端内部死循环,阻塞监听(无需手动写循环/休眠)
        while ($channel->is_consuming()) {
            $channel->wait(); // 阻塞等待消息,无消息时不占CPU
        }

        $channel->close();
        $connection->close();
    }
}

方案2:Yii2 专用扩展(更贴合框架)

推荐使用 vladimir-yuldashev/yii2-queue 扩展,支持 RabbitMQ 作为驱动,整合了 Yii2 的日志、依赖注入等特性:

  1. 安装扩展:

    composer require vladimir-yuldashev/yii2-queue
  2. 配置 config/main.php

    'components' => [
        'queue' => [
            'class' => \yii\queue\amqp\Queue::class,
            'host' => 'localhost',
            'port' => 5672,
            'user' => 'guest',
            'password' => 'guest',
            'queueName' => 'test_queue',
            'driver' => \yii\queue\amqp\ drivers\PhpAmqpLib::class,
        ],
    ],
  3. 消费者运行(Yii2 命令行):

    yii queue/listen

关键说明

  • 消费者逻辑:$channel->wait() 或扩展的 queue/listen 会启动阻塞循环,无需手动写死循环或加休眠,无消息时几乎不耗CPU。
  • 长期运行:Linux/macOS 用 nohup yii queue/listen & 后台运行,Windows 用任务计划程序设开机自启。

标签: none

添加新评论