PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange
Topic Exchange
此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息。
- 向交换机发送消息时,消息的 routing key 就是主题关键词,主题词不能随意设置,必须由 "." 联结多个主题词 (如:log.error、log.warn) .
- 必须将队列显示的绑定到指定的交换机上.
- 为队列指定队列主题词时,可以使用通配符: "#": 表示 0 或多个主题词; "*": 表示 1 个主题词.
示例
producer.php
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
// RabbitMQ 连接实例
$con = new AMQPConnection($conConfig);
// 发起连接
$con->connect();
// 判断连接结果,true成功,false失败
if(!$con->isConnected())
{
echo '连接失败';die;
}
// 新建通道
$channel = new AMQPChannel($con);
// 在指定通道上新建交换机,如果新建的交换机与已存在交换机重名但属性不同,会产生406错误。如果新建交换机与已存在交换机完全相同,不会有任何影响
$exchange = new AMQPExchange($channel);
// 交换机名称
$exchange->setName('test.topic');
// 交换机类型:按主题分发消息
$exchange->setType('topic');
// 声明交换机
$exchange->declareExchange(); // 发送消息到交换机,通过routing key指定消息的主题词
$state = $exchange->publish('apple', 'fruit.red');
if($state) echo 'Success' . PHP_EOL;
else echo 'Fail' . PHP_EOL; $state = $exchange->publish('cat', 'animal.red');
if($state) echo 'Success' . PHP_EOL;
else echo 'Fail' . PHP_EOL; $con->disconnect();
}
catch(Exception $e)
{
echo $e->getMessage();
}
consumer.php
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
$connect = new AMQPConnection($conConfig);
$connect->connect();
if(!$connect->isConnected())
{
echo '连接失败';die;
} $channel = new AMQPChannel($connect);
$exchange = new AMQPExchange($channel);
$exchange->setName('test.topic');
$exchange->setType('topic');
$exchange->declareExchange(); // 创建两个队列, 一个关联red主题词, 一个关联animal主题词
$queueRed = new AMQPQueue($channel);
$queueAnimal = new AMQPQueue($channel);
// 队列名称
$queueRed->setName('red.queue');
$queueAnimal->setName('animal.queue');
// 声明队列
$queueRed->declareQueue();
$queueAnimal->declareQueue();
// 为队列绑定主题词, *: 匹配0或多个任意主题词, #: 1个任意主题词. 绑定主题词时, 主题词出现的位置也要匹配
$queueRed->bind('test.topic', "*.red");
$queueAnimal->bind('test.topic', 'animal.#'); echo 'red queue: ' . PHP_EOL;
while($msgEnvelope = $queueRed->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
} echo 'animal queue: ' . PHP_EOL;
while($msgEnvelope = $queueAnimal->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
} $connect->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
运行结果:
red queue 获得了所有包含 red 主题词的消息, animal queue 仅获得包含 animal 主题的消息.
Fanout Exchange
该模式下的交换机是广播模式, 交换机会向所有绑定的队列分发消息, 不需要设置交换机和队列的 routing key. 即使设置了, 也会被忽略.
示例
producer.php
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
// RabbitMQ 连接实例
$con = new AMQPConnection($conConfig);
// 发起连接
$con->connect();
// 判断连接结果,true成功,false失败
if(!$con->isConnected())
{
echo '连接失败';die;
}
// 新建通道
$channel = new AMQPChannel($con);
// 在指定通道上新建交换机,如果新建的交换机与已存在交换机重名但属性不同,会产生406错误。如果新建交换机与已存在交换机完全相同,不会有任何影响
$exchange = new AMQPExchange($channel);
// 交换机名称
$exchange->setName('test.fanout');
// 交换机类型:广播模式
$exchange->setType('fanout');
// 声明交换机
$exchange->declareExchange(); for($i = 0; $i < 3; $i++)
{
$msg = '消息';
// 发送消息到交换机,Fanout模式下不需要指定routing key。即使指定也会被忽略
$state = $exchange->publish($msg . $i);
if($state)
{
echo 'Success' . PHP_EOL;
}else
{
echo 'Fail' . PHP_EOL;
}
} $con->disconnect();
}
catch(Exception $e)
{
echo $e->getMessage();
}
consumer.php
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
$connect = new AMQPConnection($conConfig);
$connect->connect();
if(!$connect->isConnected())
{
echo '连接失败';die;
} $channel = new AMQPChannel($connect); $exchange = new AMQPExchange($channel);
$exchange->setName('test.fanout');
$exchange->setType('fanout');
$exchange->declareExchange(); // 创建队列
$queue1 = new AMQPQueue($channel);
$queue2 = new AMQPQueue($channel); // 队列名称
$queue1->setName('queue1');
$queue2->setName('queue2');
// 声明队列
$queue1->declareQueue();
$queue2->declareQueue();
// 绑定队列到交换机。Fanout模式下不需要指定routing key,即使指定也会被忽略
$queue1->bind('test.fanout');
echo '队列1: ' . PHP_EOL;
while($msgEnvelope = $queue1->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
} echo PHP_EOL . '队列2: ' . PHP_EOL;
$queue2->bind('test.fanout');
while($msgEnvelope = $queue2->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
}
$connect->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}
运行结果:
两个队列获得相同的消息.
PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange的更多相关文章
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (三) -- Header Exchange
此模式下,消息的routing key 和队列的 routing key 会被完全忽略,而是在交换机推送消息和队列绑定交换机时, 分别为消息和队列设置 headers 属性, 通过匹配消息和队列的 h ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK
以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...
- Windows下基于python3使用word2vec训练中文维基百科语料(二)
在上一篇对中文维基百科语料处理将其转换成.txt的文本文档的基础上,我们要将为文本转换成向量,首先都要对文本进行预处理 步骤四:由于得到的中文维基百科中有许多繁体字,所以我们现在就是将繁体字转换成简体 ...
- flask框架----基于flask的扩展实现的简单的页面登录
废话不多说,直接上代码 from flask import Flask,render_template,request,redirect,session app = Flask(__name__,te ...
- gtk+3.0的环境配置及基于gtk+3.0的python简单样例
/********************************************************************* * Author : Samson * Date ...
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...
- php的amqp扩展 安装(windows) rabbitmq学习篇
因为RabbitMQ是由erlang语言实现的,所以先要安装erlang环境erlang 下载安装 http://www.erlang.org/download.htmlrabbitmq 下载安装 h ...
随机推荐
- vs 中switch语句快捷键列出枚举
先switch然后两下tab会补完到default,光标显示在switch后的变量这时输入枚举,输完后回车,自动补完所有枚举的case
- wincap的安装与环境配置
首先开始知道什么是wincap? 1 通常情况下,大多数的网络应用程序都是通过操作系统来访问网络(sockets),这样是算比较简单的了,毕竟已经封装好了 ,有的时候呢需要一些底层的细节比如协议处理, ...
- ubuntu中desktop与alternate版本的区别(转载)
转自:http://www.hyleong.com/ubuntu-desktop-alternate/ 今天ubuntu发布了11.04版本,但是下载的时候有desktop和alternate版本,他 ...
- springboot(四)拦截器和全局异常捕捉
github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...
- 【正睿多校联盟Day4 T4 简单的数论题】
题目名有毒 由于并没有系统地开始学习数论,所以数论题基本靠暴力. 然鹅本题的题解相当简单: emmm....我当你没说 一个简单易懂的方法是这样的: 1. 欧拉定理的推论 若正整数a,n互质,则对于任 ...
- ssh 公钥登录远程主机
ssh-keygen 然后一路回车就可以了 ssh-copy-id user@host user代表用户名,host代表主机地址 然后根据提示输入远程主机的密码,成功,再登录就不用输入密码了
- 图的遍历---------开始开始-------o(∩_∩)o 哈哈
图的遍历 深度优先搜索(Depth First Search , DFS) --深度优先搜索--我的理解就是分身术的另一种实现方法---用分身术将所有能看到的路都走一遍----这就是深度搜索--- 下 ...
- centos 允许远程连接mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- 积分图像 分类: 图像处理 Matlab 2015-06-06 10:30 149人阅读 评论(0) 收藏
积分图像(integral image)是一种快速计算矩形区域之和的数据结构,常利用它对算法进行加速.积分图像中处的值是原始灰度图像的左上角与当前点所围成的矩形区域内所有像素点的灰度值之和,即: 其中 ...