一、概述
rabbitmq 是基于amqp协议的,因此了解amqp协议中的一些概念和消息的声明周期,对于理解rabbitmq原理是有很大帮助的。
二、配置环境
三、规划
在 lnmp 环境内写消费者和生产者,消费者和生产者使用的都是外部rabbitmq的服务。
存在的问题:
在lnmp容器的环境里,如何使用另一个容器 rabbitmq的服务。
解决方案:
比如这里,我的rabbitmq容器的容器名是rabbit,因此我想看rabbit容器的ip,可以通过命令
docker inspect rabbit
可以看到,其他容器想和rabbitmq容器通信,使用172.17.0.3 即可
四、代码
1、生产者代码 producer.php
declare(strict_types=1);
try{
// 定义mq连接信息
$amq=newAMQPConnection([
'host'=>'172.17.0.3',
'port'=>5672,
'vhost'=>'/',
'login'=>'guest',
'password'=>'guest'
]);
// 连接mq
$amq->connect();
// 通过mq连接创建信道
$channel=newAMQPChannel($amq);
// 通过信道创建交换器对象
$exchange=newAMQPExchange($channel);
// 设置交换器名称
$exchange->setName('product_exchange');
// 设置交换器类型为direct
$exchange->setType(AMQP_EX_TYPE_DIRECT);
// 声明交换器
$exchange->declareExchange();
$data=[
'id'=>88,
'name'=>'小脑斧'
];
$data=json_encode($data);
// 发布消息
$exchange->publish($data,'self_define_routing_key');
}catch(\Exception $e){
var_dump($e->getMessage());
}
2、消费者代码 consumer.php
declare(strict_types=1);
try{
// 交换器名称
$exchangeName='product_exchange';
// 队列名称
$queueName='createProduct';
// RouteKey
$routeKey='self_define_routing_key';
// 定义mq连接信息
$amq=newAMQPConnection([
'host'=>'172.17.0.3',
'port'=>5672,
'vhost'=>'/',
'login'=>'guest',
'password'=>'guest'
]);
// 连接mq
$amq->connect();
// 通过mq连接创建信道
$channel=newAMQPChannel($amq);
// 通过信道创建交换器对象
$exchange=newAMQPExchange($channel);
// 设置交换器名称
$exchange->setName($exchangeName);
// 声明自己监听哪个队列
$queue=newAMQPQueue($channel);
$queue->setName($queueName);
$queue->declareQueue();
//绑定监听
$queue->bind($exchangeName,$routeKey);
$queue->consume(function($envelope,$queue){
$data=$envelope->getBody();
var_dump($data);
//回应ack
$queue->ack($envelope->getDeliveryTag());
});//阻塞监听
}catch(\Exception $e){
var_dump($e->getMessage());
}
3、执行结果
先执行 php consumer.php 开始监听消息队列
再执行 php producer.php ,会将消息投递到rabbitmq的queue里,这时你会看到 消费者的窗口已经有输出了,说明消息队列生产并消费成功
然后再执行
五、总结
要使用rabbitmq,需要以下几步:
1、对amqp协议有一定了解
2、安装rabbitmq服务
3、安装amqp扩展
4、写生产者和消费者代码
5、执行生产者和消费者代码,看结果