理论讲解,官网已经说的非常清楚了。这里直接上代码

代码是用官网例子改的,直接进行URL访问就可以了。

代码的改动,主要是解决了无法通过url访问,看操作结果的问题。

这里要提醒一下:

1    要给用户配置虚拟主机  Virtual Hosts,否则在消费者里拿不到消息

2    因为消费者里写了while循环,所以修改代码后。要在服务器重启rabbit,这样才能立即生效

 

代码

连接类

和数据库一样,创建一个连接

<?php
namespace app\rabbit\controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class RabbitMQConnection
{
    private static $connection;
    const MQ_HOST = '127.0.0.1';   
    const MQ_PORT = '5672';
    const MQ_USERNAME = 'test';    //账号
    const MQ_PASSWORD = 'test';    //密码

    private function __construct(){
        
    }
    //获得连接
    public static function getConnection(){
        if (empty(self::$connection)) {
            self::$connection = new AMQPStreamConnection(self::MQ_HOST, self::MQ_PORT, self::MQ_USERNAME, self::MQ_PASSWORD);
        }
        return self::$connection;
    }

}

 

生产者

<?php
namespace app\rabbit\controller;
use PhpAmqpLib\Message\AMQPMessage;

class Sender
{
    public function send($msg='Hello World!') {
        //创建连接
        $connection = RabbitMQConnection::getConnection();
        //创建管道
        $channel = $connection->channel();

        //声明一个队列
        //参数1 队列的名字
        //参数3 是否持久化队列,队列数据存储在内存中,重启rabbit会丢失,如果设置为true,则会保存到erlang自带的数据库中,重启后重新读取
        //参数5 是否自动删除
        $channel->queue_declare('hello', false, false, false, false);
        $mess = new AMQPMessage($msg);
        $channel->basic_publish($mess, '', 'hello');

        echo " --send msg ".$msg."\n";
        $channel->close();
        $connection->close();
    }

}

TP配置一个路由,浏览器访问。那怎么看队列有没用创建成功呢?

RabbitMQ使用一 简单队列

去管理后台看,这里能看到有个队列名字叫 hello,队列里有一条数据

RabbitMQ使用一 简单队列

 

消费者

<?php
namespace app\rabbit\controller;
use think\Db;

class Receive{

    public function rec() {
        $connection = RabbitMQConnection::getConnection();
        $channel = $connection->channel();

        $channel->queue_declare('hello', false, false, false, false);

        echo " [*] Waiting for messages. To exit press CTRL+C\n";

        $callback = function ($msg) {
            $data = [
                'content'  => $msg->getBody(),
                'add_time' => time(),
            ];
             Db::name('logs')->insert($data);         //官网的例子都是在控制台直接输出的,url请求的话就存到数据库看效果
        };

        $channel->basic_consume('hello', '', false, true, false, false, $callback);

        while ($channel->is_consuming()) {
            $channel->wait();
        }
    }
}

直接去数据库里看有没用拿到相应的消息就行了。

插入了一条新数据

RabbitMQ使用一 简单队列

再看管理后台,队列里的数据没有了。

RabbitMQ使用一 简单队列

相关文章:

  • 2021-08-27
  • 2022-12-23
  • 2021-05-29
  • 2021-07-11
  • 2021-10-31
  • 2021-05-03
猜你喜欢
  • 2021-12-07
  • 2021-07-27
  • 2021-06-01
  • 2021-10-09
  • 2021-05-21
  • 2021-12-07
相关资源
相似解决方案