RabbitMQ 安装部署链接
安装 RabbitMQ延时队列插件
下载好的文件移动到 rabbitmq 的插件 plugins 下
docker exec -it 49a8887d7f67 /bin /bash 进入容器代码
执行此命令安装即可
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
如果部署的 rabbitmq 为线上的话我们要将下载好的文件传输到线上并进行添加操作
以宝塔为例子:
docker cp /RBMQ/rabbitmq_delayed_message_exchange-3.10.2.ez 49a2887d7f67:/opt/rabbitmq/plugins
文件添加后在执行一下安装代码即可
查询延时队列插件是否安装完成
composer命令安装RabbitMQ
composer require php-amqplib/php-amqplib
书写核心代码操作
<?php
namespace App\Http\Controllers\Service;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;
class RabbitmqServer
{
private $host = "127.0.0.1";
private $port = 5672;
private $user = "guest";
private $password = "guest";
private $msg;
private $channel;
private $connection;
// 过期时间
const TIMEOUT_5_S = 5; // 5s
const TIMEOUT_10_S = 10; // 10s
private $exchange_logs = "logs";
private $exchange_direct = "direct";
private $exchange_delayed = "delayed";
private $queue_delayed = "delayedQueue";
const EXCHANGETYPE_FANOUT = "fanout";
const EXCHANGETYPE_DIRECT = "direct";
const EXCHANGETYPE_DELAYED = "x-delayed-message";
public function __construct($type = false)
{
$this->connection = new AMQPStreamConnection($this->host, $this->port, $this->user, $this->password);
$this->channel = $this->connection->channel();
// 声明Exchange
$this->channel->exchange_declare($this->exchange_delayed, self::EXCHANGETYPE_DELAYED, false, true, false, false, false, new AMQPTable(["x-delayed-type" => self::EXCHANGETYPE_DIRECT]));
$this->channel->queue_declare($this->queue_delayed, false, true, false, false);
$this->channel->queue_bind($this->queue_delayed, $this->exchange_delayed, $this->queue_delayed);
}
/**
* delay creat message
*/
public function createMessageDelay($msg, $time)
{
$delayConfig = [
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
'application_headers' => new AMQPTable(['x-delay' => $time * 1000])
];
$msg = new AMQPMessage($msg, $delayConfig);
return $msg;
}
/**
* delay send message
*/
public function sendDelay($msg, $time = self::TIMEOUT_10_S)
{
$msg = $this->createMessageDelay($msg, $time);;
$this->channel->basic_publish($msg, $this->exchange_delayed, $this->queue_delayed);
$this->channel->close();
$this->connection->close();
}
/**
* delay consum
* 控制器调用后走这个方法
*/
public function consumDelay()
{
$callback = function ($msg) {
//再次写需要进行的操作
echo ' [x] ', $msg->body, "\n";
$this->channel->basic_ack($msg->delivery_info['delivery_tag'], false);
};
$this->channel->basic_qos(null, 1, null);
$this->channel->basic_consume($this->queue_delayed, '', false, false, false, false, $callback);
echo ' [*] Waiting for logs. To exit press CTRL+C', "\n";
while (count($this->channel->callbacks)) {
$this->channel->wait();
}
$this->channel->close();
$this->connection->close();
}
}
安装一个新的处理类
php artisan make:command RabbitMQConmmand
<?php
namespace App\Console\Commands;
use App\Http\Business\RabbitMQBusiness;
use Illuminate\Console\Command;
class RabbitMQConmmand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rabbitmq_consumer';//给消费者起个command名称
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @return int
*/
public function handle()
{
$Rabbit = new RabbitMQBusiness("x-delayed-message");
$Rabbit->consumDelay();
}
}
在控制器调用操作
// 消息队列延迟操作
public function RbmqCache()
{
// 获取订单所有值
$orderId = request('order_id');
// 进行数据存储MQ
$Rabbit = new RabbitMQBusiness("x-delayed-message");
// 传递数据,并设置时间为10秒执行
$Rabbit->sendDelay($orderId,10);
}
最后使用命令开始测试
php artisan rabbitmq_consumer