Yii2 RabbitMQ 使用详解

本文详细介绍了如何在Yii2框架中使用RabbitMQ进行消息队列的处理。首先,文章提及了安装php-amqplib库的注意事项,避免使用可能导致版本冲突的yii2-amqp包。接着,讲解了php-amqplib的配置步骤,通过Composer安装并介绍了配置过程。最后,文章展示了如何在Yii2应用中创建一个类并从控制器调用,以简洁的方式实现消息队列的功能。

PHP虽然在普通消息队列中表现不算特别好,但是因为其轻便简单作为客户端来接收其他语言脚本处理后的消息再作为服务端传给js客户端也是很常见的,所以PHP消息队列的使用还是很重要。

安装php-amqplib

  • 这里注意的是还有叫yii2-amqp的包,这些直接通过component注入,但是可能会因为版本不同出各种各样的问题,还有各种各样的依赖包也可能因为版本出现问题,比如yii2-amqp这个包
requires

php: >=5.3.0
videlalvaro/php-amqplib: 2.4.0
webtoucher/yii2-commands: *
requires (dev)

None

suggests

None

provides

None

conflicts

None

replaces

None

需要的几个依赖包版本都有一点问题,笔者在试验的时候已经不能正常使用了(也可能是我的姿势不对),反正直接用原本的那个php-amplib包是更好的,配置也非常的简单。

配置 php-amqplib

  • 可以直接根据github上的README.md来配置,这里再稍微说一下

$ php composer.phar require php-amqplib/php-amqplib “2.6.*”

安装好之后我们可以在vendor下找到php-amqplib包。

使用方法

  • 不需要去修改配置文件夹
在要使用队列的相应控制器下加上
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection;
  • 接下来建立一个类
class PhpClient {
    private $connection;
    private $channel;
    private $callback_queue;
    private $response;
    private $corr_id;
    private $result = '';

    CONST HOST = "your_host_ip";
    CONST PORT = 5672; //默认5672
    CONST USER = "username"; //用户名
    CONST PASS = "password";//密码

    public function __construct() {
        $this->connection = new AMQPStreamConnection(
            self::HOST, self::PORT, self::USER, self::PASS); //建立连接

        $this->channel = $this->connection->channel();
        list($this->callback_queue, ,) = $this->channel->queue_declare(
            "", false, false, true, false);
        $this->channel->basic_consume(
            $this->callback_queue, '', false, false, false, false,
            array($this, 'on_response'));
    }
    public function on_response($rep) {
        if($rep->get('correlation_id') == $this->corr_id) {
            $this->result .= $rep->body;
            $this->response = $rep->body;
        }
    }

    public function call($n) {
        $this->response = null;
        $this->corr_id = uniqid();

        $msg = new AMQPMessage(
            (string) $n,
            array('correlation_id' => $this->corr_id,
                'reply_to' => $this->callback_queue)
        );
        $this->channel->basic_publish($msg, '', 'queue'); //这里的queue是消息名称
        while($this->response != "end") {
            $this->channel->wait();
        }
        return $this->result;
    }
}
  • 在控制器中调用这个类
$client = new PhpClient();
$responses = $client->call('information'); //在这里传入发送给服务端脚本的内容

这样就可以很简单的实现消息队列了,封装好的方法有兴趣的可以自行查看源代码

                                                    --by vampirebitter
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值