RabbitMQ简单实例demo
基本使用
在php中创建一个RabbitMQ的生产者基本步骤:
1、链接connection
2、创建一个channel
3、创建或链接一个交换机
4、创建或链接一个队列
5、交换机绑定队列
6、投递消息
7、关闭channel
8、关闭connection
链接
use PhpAmqpLib\Connection\AMQPStreamConnection;
//创建一个链接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
//创建一个channel
$channel = $connection->channel();
创建一个交换机
//创建一个交换机
$channel->exchange_declare('e1', 'direct', false, false, true, false, false, null, null);
参数解析:
- exchange 交换机名称
- type 交换机类型(direct, fanout, topic, header)
- passive
- durable 持久化
- auto_delete 是否自动删除
- internal 是否是内置交换机
- nowait 是否等待服务器确认
- arguments 其他参数
- ticket
参数说明:
- auto_delete:
自动删除功能必须要在交换器曾经绑定过队列或者交换器的情况下,处于不再使用的时候才会自动删除,
如果是刚刚创建的尚未绑定队列或者交换器的交换器或者早已创建只是未进行队列或者交换器绑定的交换器是不会自动删除的。 - internal:
内置交换器是一种特殊的交换器,这种交换器不能直接接收生产者发送的消息,
只能作为类似于队列的方式绑定到另一个交换器,来接收这个交换器中路由的消息,
内置交换器同样可以绑定队列和路由消息,只是其接收消息的来源与普通交换器不同。 - noWait
当noWait为true时,声明时无需等待服务器的确认。
通道可能由于错误而关闭。 添加一个NotifyClose侦听器应对任何异常。
创建一个队列
//创建一个队列
$channel->queue_declare('hello', false, false, false, false);
参数解析:
- queue 队列名称
- passive
- durable 持久化
- exclusive 排它
- auto_delete 是否自动删除
- nowait 是否等待服务器确认
- arguments 其他参数
- ticket
参数说明:
- exclusive 排他
排他队列只对首次创建它的连接可见,排他队列是基于连接(Connection)可见的,并且该连接内的所有信道(Channel)都可以访问这个排他队列,在这个连接断开之后,该队列自动删除,
由此可见这个队列可以说是绑到连接上的,对同一服务器的其他连接不可见。
同一连接中不允许建立同名的排他队列的
这种排他优先于持久化,即使设置了队列持久化,在连接断开后,该队列也会自动删除。
非排他队列不依附于连接而存在,同一服务器上的多个连接都可以访问这个队列。 - auto_delete 设置是否自动删除。
为true则设置队列为自动删除。
自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。
不能把这个参数错误地理解为:”当连接到此队列的所有客户端断开时,这个队列自动删除”,因为生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列。
绑定交换机到队列
//绑定交换机到队列
$channel->queue_bind('queue', 'exchange', 'routing_key', 'nowait', 'arguments', 'ticket');
参数解析:
- queue 队列名称
- exchange 交换机名称
- routing_key 路由规则,根据交换机类型来设定
- nowait 是否等待服务器确认
- arguments 其他参数
绑定交换机
//绑定交换机
$channel->exchange_bind($destination, $source, $routing_key, $nowait, $arguments, $ticket);
参数解析:
- destination 目的交换器
- source 源交换机
- routing_key 路由规则
- nowait 是否等待服务器确认
- arguments 其他参数
生产者发送消息至交换器source中,交换器source根据路由键找到与其匹配的另一个交换器destination,井把消息转发到destination中,
进而存储在.destination绑定的队列queue中,某种程度上来说destination交换器可以看作一个队列。如图:
投递消息
//投递消息
$channel->basic_publish($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket);
参数解析:
- msg 消息体
- exchange 交换器名称
- routing_key 路由规则
- madatory 是否为无法路由的消息进行返回处理
- immediate 是否对路由到无消费者队列的消息进行返回处理
- ticket
参数说明:
- madatory
消息发布的时候设置消息的 mandatory 属性用于设置消息在发送到交换器之后无法路由到队列的情况对消息的处理方式,
设置为 true 表示将消息返回到生产者,否则直接丢弃消息 - immediate
参数告诉服务器至少将该消息路由到一个队列中,否则将消息返回给生产者。imrnediate参数告诉服务器,如果该消息关联的队列上有消费者,
则立刻投递:如果所有匹配的队列上都没有消费者,则直接将消息返还给生产者,不用将消息存入队列而等待消费者了。
消费消息
Rabbitmq消费方式共有2种,分别是推模式和拉模式
推模式是通过持续订阅的方式来消费信息,
Consume将信道(Channel)直为接收模式,直到取消队列的订阅为止。在接收模式期间,RabbitMQ会不断地推送消息给消费者。
推送消息的个数还是会受到channel.Qos的限制
//消费消息
$channel->basic_consume($queue, $consumer_tag = '',$no_local = false,$no_ack = false,$exclusive = false,$nowait = false,$callback = null,$ticket = null,$arguments = array());
参数解析:
- queue 队列名称
- consumer_tag 消息者名称
- no_local 设置为true则表示不能将同一个Connection中生产者发送的消息传送给这个Connection中的消费者
- no_ack 是否确认消费
- exclusive 排他
- nowait bool 是否等待服务器确认
- callback
- ticket
- argments 其他参数
拉模式:
相对来说比较简单,是由消费者主动拉取信息来消费,同样也需要进行ack确认消费