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 ...
随机推荐
- 利用http_load测试Web引擎性能
http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 一.获得http_load httpd_load的官方站 ...
- c++爬虫子
Larbin是一个用C++开发的开源网络爬虫,有一定的定制选项和较高的网页抓取速度. 下图表示了一般爬虫抓取网页的基本过程. 抓取以/Larbin.conf中的startUrl做为种子URLs开始. ...
- Ubuntu下搭建基于apache2的gerrit+gitweb服务器
说明:Ubuntu版本12.04 1. 配置gerrit管理帐号 1 sudo adduser gerrit 增加sudo权限: 1 sudo usermod -a -G sudo gerrit 切换 ...
- WEB开发框架系列教程 (一)快速创建解决方案
执行<华东信息辅助开发工具> 程序 打开程序界面如下图 输入用户名.密码进行登录 如果暂时还没有用户名和密码,点击注册提供机器码给管理员进行注册. 管理员QQ:93346562 下图是:点 ...
- Mysql数据库的数据类型、索引、锁、事务和视图
Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...
- 线程Coroutines 和 Yield(转)
之前一直很纠结这个问题,在网上找到了这篇文章,给大家分享下: 第一种方法: void Start() { print("Starting " + Ti ...
- mysql主从同步异常原因及恢复
mysql主从同步异常原因及恢复 前言 mysql数据库做主从复制,不仅可以为数据库的数据做实时备份,保证数据的完整性,还能做为读写分离,提升数据库的整体性能.但是,mysql主从复制经常会因为某些原 ...
- 计算机视觉-SIFT特征匹配进行目标转换
Lowe将SIFT算法分解为如下四步: 1. 尺度空间极值检测:搜索所有尺度上的图像位置.通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点. 关键点定位:在每个候选的位置上,通过一个拟合精细的模 ...
- 题解报告:hdu 1398 Square Coins(母函数或dp)
Problem Description People in Silverland use square coins. Not only they have square shapes but also ...
- Latex排版工具的使用(二) 分类: Latex 2014-06-14 23:01 389人阅读 评论(0) 收藏
Latex可以支持中文排版,如何实现中文支持可以到网上查找教程. 下面编写一段对中文排版的Latex源文档: 新建文件second.tex: \documentclass{article} \usep ...