如果接收的消息routeKey很多,那我们就的一行行添加(当然你可以采用foreach循环),如果我们要对日志的来源进行再分类,比方说有register、login、mail等等,那么久需要bind很多的routeKey,大概会如下:
~~~
$queue->bind('exchange.log','register.warning');
$queue->bind('exchange.logs','register.error');
$queue->bind('exchange.logs','register.critical');
$queue->bind('exchange.logs','register.alert');
$queue->bind('exchange.logs','register.emergency');
.......
$queue->bind('exchange.log','mail.warning');
$queue->bind('exchange.logs','mail.error');
$queue->bind('exchange.logs','mail.critical');
$queue->bind('exchange.logs','mail.alert');
$queue->bind('exchange.logs','mail.emergency');
~~~
那么我们有没有一种办法来处理这种情况呢,这就是本章的学习的exchange中topic类型。 使用topic类型后,routKey支持模糊匹配,但仅支持以下2种写法:
*(星号)可以代表一个单词
#(井号)可以代表零个或多个单词 //请务必注意是单词,此时的routeKey是使用.链接的字符串。
topic_send.php
~~~
<?php
$config = [
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
];
$conn = new \AMQPConnection($config);
$conn->connect();
$channel = new \AMQPChannel($conn);
$channel->qos(0,0);
$exchange = new \AMQPExchange($channel);
$exchange->setName('exchange.all.logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();
//循环生成消息需要发布的消息
$origins = ['register','login','mail'];
$levels = ['debug','info','notice','warning','error','critical','alert','emergency'];
foreach ($origins as $origin) {
foreach ($levels as $level) {
$message = "[$origin]Message[$level]";
$routeKey = "$origin.$level";
//echo $message."======".$routeKey."\n";
$result = $exchange->publish($message, $routeKey);
var_dump($result);
}
}
~~~
topic_receive.php
~~~
<?php
$config = [
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
];
$conn = new \AMQPConnection($config);
$conn->connect();
$channel = new \AMQPChannel($conn);
$channel->qos(0,1);
$queue = new \AMQPQueue($channel);
$queue->setName("queue.all.errors");
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();
$queue->bind('exchange.all.logs','#.warning');
$queue->bind('exchange.all.logs','#.error');
$queue->bind('exchange.all.logs','#.critical');
$queue->bind('exchange.all.logs','#.alert');
$queue->bind('exchange.all.logs','#.emergency');
$queue->consume('processMessage',AMQP_AUTOACK);
function processMessage($envelope, $queue) {
global $i;
echo "Message $i: " . $envelope->getBody() . "\n";
$i++;
}
~~~
- 关于我
- laravel
- quickstart
- quickstart-intermediate
- swoole
- (一)快速起步
- php7
- swoole异步高性能
- 开发中常见问题
- event扩展的安装
- phptrace
- 用C/C++写php扩展
- 无聊的笔试题
- rewrite二级目录转二级域名
- php多进程
- rpc-yar
- php专家列表
- php守护进程
- php函数防止超时
- php分析报错信息
- gdb调试php
- php-cli模式
- composer/pear
- 基础
- sublime+xdebug
- 开启opcache
- 前端
- js
- linux
- Xshell连接不上Ubuntu解决方式
- xshell
- centos安装中文输入
- centos下安装谷歌浏览器
- centos安装phpstorm
- php7之phpredis安装
- 磁盘大小
- dns
- TCP/IP协议
- HTTP
- tcpdump
- zbacktrace
- gdb调试php扩展
- lsof
- perf
- lnmp
- first
- 重定向
- echo
- 键盘高效操作
- 权限控制
- 进程
- 环境变量
- vi
- 软件包管理
- 网络
- 查找文件
- 压缩
- 正则
- sed/awk
- 编译程序
- shell脚本
- shell认识
- sh脚本
- sh调试相关
- win共享文件夹给虚拟机
- git
- git的安装
- 常用命令
- 本地到远程仓库
- 远程到本地仓库
- 分支管理
- bug分支
- feature
- 标签
- 多人协作
- FAQ
- C/C++
- 难点
- 修饰符
- 数组
- 字符串
- 指针
- 引用
- 面向对象
- 类访问修饰符
- 构造函数
- 操作文件
- mysql集群
- 使用navicat操作MySQL数据库能不能整个数据库搜索一条数据?
- 帮助的使用
- 存储引擎的选择
- 数据类型/字符集
- 索引
- kafka集群
- rabbitmq集群
- (一)初识rabbitmq
- (二)原理
- (三)消息模型
- (四)rabbitmq&php基础
- (五)持久化&route&指定exchange
- (六)发布订阅
- (七)route key
- (八)topic
- elasticsearch集群
- (一)服务端搭建
- (二)elasticsearch&php
- (三)head插件
- redis集群
- github
- 设计模式
- createType
- factory_method.php
- abstract_factory.php
- mysql_singleton.php
- builder.php
- prototype.php
- structType
- adapter.php
- 数据结构与算法
- python