发布订阅模式, 其图示是这样子的
x 表是的是交换机, 它会把消息发送给 两个或以上的队列, 就像一个广播一样, 队列中的消息是一样的
我们之前的 简单模式 和 工作模式,是有一个默认交换机存在的
交换机是有4种类型可以使用的分是是
direct :定向
fanout : 广播(就是本节我们要讲的)
topic :通配符匹配
header: 参数匹配 这种模式很少用
从图中, 我们可以看到, 生产者p 只和交换机x 进行通信, 不和队列有连系, 所有我们的生产者代码如下
pubsub_sender.php
require __DIR__.'/../vendor/autoload.php';
$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
$channel = $connection->channel();
//在生产者中创建一个交换机, 使用的模式是 广播模式 fanout
$channel->exchange_declare("pubsub_exchange","fanout",false,false,false);
//创建一个消息对象
$msg = new \PhpAmqpLib\Message\AMQPMessage("这是一个广播消息, 会分发到两个队列中去, 你们看好了");
//把消息转给 交换机 生产者就算完事
$channel->basic_publish($msg,"pubsub_exchange","");
//关闭资源
$channel->close();
$connection->close();
pubsub_receive1.php
消费者和交换机是连接的, 所以消费者中要 指明交换机,并创建队列,把队列绑定到交换机上
require __DIR__.'/../vendor/autoload.php';
$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
$channel = $connection->channel();
//指明交换机, 这一行要和生产者中的那一行一至, 如有没有交换机会新增, 如果有,就不会新增
$channel->exchange_declare('pubsub_exchange', 'fanout', false, false,false );
//创建一个队列
$channel->queue_declare("pubsub_queue1",false,false,false,false);
//把队列和交换机进行绑定, 这里我们用的是 fanout 广播模式, 所以第三个参数 routing_key是空
$channel->queue_bind("pubsub_queue1","pubsub_exchange","");
$callback = function($msg){
echo "这是消费者1收到的消息,其它的消息者应该也有这个消息--------".$msg->body;
};
$channel->basic_consume("pubsub_queue1","",false,false,false,false,$callback);
while(count($channel->callbacks)){
$channel->wait();
}
pubsub_receive2.php
require __DIR__.'/../vendor/autoload.php';
$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
$channel = $connection->channel();
$channel->exchange_declare('pubsub_exchange', 'fanout', false, false,false);
$channel->queue_declare("pubsub_queue2",false,false,false,false);
$channel->queue_bind("pubsub_queue2","pubsub_exchange","");
$callback = function($msg){
echo "这是消费者2收到的消息,其它的消息者应该也有这个消息--------".$msg->body;
};
$channel->basic_consume("pubsub_queue2","",false,false,false,false,$callback);
while(count($channel->callbacks)){
$channel->wait();
}
从上面的代码中我们可以看到, 我们在生产者中创建了一个交的换机, 并把队列消息发给了交换机
在消费者中, 我们新建了队列, 并把队列和交 换机进行了绑定
这种模是和work_queue的区别在于, 生产者产生的同一个消息可以被不同的消费者使用, 而work_queue 中的消息, 只能被一个消费者使用