理论讲解,官网已经说的非常清楚了。这里直接上代码
代码是用官网例子改的,直接进行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配置一个路由,浏览器访问。那怎么看队列有没用创建成功呢?

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

消费者
|
<?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();
}
}
}
|
直接去数据库里看有没用拿到相应的消息就行了。
插入了一条新数据

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