一、常用方法说明
生产者:
1、创建连接:
/**
* 参数说明
* $host : RabbitMQ 服务器主机IP地址
* $post : RabbitMQ服务器端口
* $user : RabbitMQ服务器的用户名
* $password : RabbitMQ服务器的密码
* $vhost : 连接rabbitmq服务器的vhost(虚拟主机)
*/
$connection = new AMQPStreamConnection($host,$port,$user,$password,$vhost);
2、获取信道
/*
*$channel_id 信道ID,不传则获取$channel[“”]信道,再无则循 环$this->channle数组,下标从1到最大信道数找第一个不是AMQPChannel对象的下标,实例化并返回AMQPChannel对象,无则抛出异常No free channel ids
*/
$channel = $connection->channel($channel_id);
3、在信道创建交换机
/**
* $exchange_name 交换机名字
* $type 交换机类型:
* 直连交换机:Direct
* 扇形交换机:Fanout
* 主题交换机:Topic
* 首部交换机:Headers
* $passive 检测exchange是否存在,设为true,若队列存在则命令成功返回(调用其他参数不会影响exchange属性),若不存在不会创建exchange,返回错误。设为false,如果exchange不存在则创建exchange,调用成功返回。如果exchange已经存在,并且匹配现在exchange的话则成功返回,如果不匹配则exchange声明失败
* $durable 是否持久化
* $auto_delete 连接断开的时候,exchange是否自动删除
*/
$channel->exchange_declare($exchange_name,$type,$passive,$durable,$auto_delete);
交换机类型说明:
3.1、扇形交换机:
扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要“思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。
3.2、直连交换机:
直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。这样当一个交换机绑定多个队列,就会被送到对应的队列去处理。适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。
3.3、主题交换机:
发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用 .#.… 的格式,每个部分用 . 分开,其中:
- *表示一个单词
- #表示任意数量(零个或多个)单词
4、声明队列:
/*
* $queuename 队列名称
* $passive 检查queue是否存在
* $durable 是否开启队列持久化
* $exclusive 队列是否可悲其他队列访问
* $auto_delete 通道关闭后,是否自动删除队列
*/
$channel->queue_declare($queuename,$passive,$durable,$exclusive,$auto_delete);
5、绑定交换机:
/*
* $queuename 队列名称
* $exchangename 交换机名称
* $binding_key 默认为空,表示该交换机对所有消息感兴趣
*/
$channel->queue_bind($queuename,$exchangename,$binding_key);
6、创建要发送的消息:
/*
* $data string类型,要发送的消息
* $properties array类型 设置的属性,比如消息持久化['delivery_mode'=>2]
*/
$msg = new AMQPMessage($data,$properties);
7、创建要发送的消息:
/*
* $msg 要发送的消息
* $exchange 交换机名称
* $routing_key 路由键
*/
$channel->basic_publish($msg,$exchange,$routing_key);
8、关闭信道和连接
$channel->close();
$connection->close();
消费者:
1、消费消息:
/*
* $aueue 队列名称
* $consumer_tag 消费者标签,用来区别多个消费者
* $no_local 设置为true,表示不能将同一个connection中生产者发送的消息传递给这个connection中的消费者
* $no_ack 是否自动确认消息,收到消息后,是否不需要回复确认即被认为被消费
* $exclusive 是否排它,即这个队列只能由一个消费者消费.适用于任务不允许进行并发处理的情况下
* $nowait 不返回执行结果,但是如果排他开启的话,则必须需要等待结果的,如果两个一起开就会报错
*/
$channel->basic_consume( $queue = '',$consumer_tag = '',$no_local = false,$no_ack = false,$exclusive = false,$nowait = false,$callback = null,);