PHP实现RabbitMQ的Publish/Subscribe
<?php
/**
* Created by PhpStorm.
* User: 豆腐居士
* Date: 2018/5/30
* Time: 上午11:01
*/ class AqiTask extends BaseTask
{
const EX_NAME = 'aqi_fanout';
function clientAction()
{
$conn = new AMQPConnection([
'host' => '0.0.0.0',
'port' => 5672,
'login' => 'wangwang',
'password' => '123456'
]);
if (!$conn->connect()) {
exit('fail');
}
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName(self::EX_NAME);
$ex->setType(AMQP_EX_TYPE_FANOUT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
$ex->declareExchange();
for ($i = 0; $i < 10; $i++) {
$msg = 'hello fanout:' . $i;
echo $msg . PHP_EOL;
$ex->publish($msg);
}
$conn->disconnect();
} function server1Action()
{
$conn = new AMQPConnection([
'host' => '0.0.0.0',
'port' => 5672,
'login' => 'wangwang',
'password' => '123456'
]);
if (!$conn->connect()) {
exit('fail');
}
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName(self::EX_NAME);
$ex->setType(AMQP_EX_TYPE_FANOUT); //fanout类型
$ex->setFlags(AMQP_DURABLE); //持久化
$ex->declareExchange(); $queue = new AMQPQueue($channel);
$queue->setName('q1');
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();
$queue->bind($ex->getName());try {
$queue->consume(function ($envelope, $q) {
echo 'server1:' . $envelope->getBody(), PHP_EOL;
$q->ack($envelope->getDeliveryTag()); //这里是手动应答 如果使用默认的自动应答,进程退出后消息会丢失
});
} catch (\Exception $e) {
echo $e->getMessage();
}
} function server2Action()
{
$conn = new AMQPConnection([
'host' => '0.0.0.0',
'port' => 5672,
'login' => 'wangwang',
'password' => '123456'
]);
if (!$conn->connect()) {
exit('fail');
} $channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName(self::EX_NAME);
$ex->setType(AMQP_EX_TYPE_FANOUT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange(); $queue = new AMQPQueue($channel);
$queue->setName('q2');
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();
$queue->bind($ex->getName());$queue->consume(function ($envelope, $q) {
echo 'server2:' . $envelope->getBody(), PHP_EOL;
$q->ack($envelope->getDeliveryTag());
});
}
}
PHP实现RabbitMQ的Publish/Subscribe的更多相关文章
- 【RabbitMQ】Publish/Subscribe
Publish/Subscribe 在上一节我们创建了一个work queue.背后的设想为每个任务被分发给明确的消费者.这节内容我们将做一些完全不同的事情 -- 我们将发送一条消息给多个消费者.这种 ...
- RabbitMQ(三) -- Publish/Subscribe
RabbitMQ(三) -- Publish/Subscribe `rabbitmq`支持一对多的模式,一般称为发布/订阅.也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消 ...
- RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- RabbitMQ --- Publish/Subscribe(发布/订阅)
目录 RabbitMQ --- Hello Mr.Tua RabbitMQ --- Work Queues(工作队列) 前言 在第二篇文章中介绍了 Work Queues(工作队列),它适用于把一个消 ...
- RabbitMQ 分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅
在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
随机推荐
- loj6392 「THUPC2018」密码学第三次小作业 / Rsa
还是挺好做的,\((e_1,e_2)=1 \Rightarrow e_1s+e_2t=0\),\(m \equiv m^1 \equiv m^{e_1s+e_2t} \equiv c_1^s c_2^ ...
- 4、CSS基础part-2
1.background-1 ①设置background-image ②设置background-attachment为fixed 可以声明图像相对于可视区是固定的(fixed),因此不会受到滚动的影 ...
- CSS视觉格式化模型
CSS视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.这是CSS 2.1的一个基础概念.视觉格式化模型根据CSS盒模型为文档的每个元素生成0 ...
- Xmanager用法(export DISPLAY=客户端IP:0.0)
1.在用户的目录下找到文件.bash_profile或profile,用vi对其进行编辑.加入下列命令行: DISPLAY=192.168.88.71:0.0;export DISPLAY 2.如果只 ...
- 基于web自动化测试框架的设计与开发(本科论文word)
- pip更新产生的问题及其解决方法?
运行 pip3 install --upgrade pip 发生错误: from pip import main ImportError: cannot import name 'main' 将以下代 ...
- navigationBar 设置关于setTranslucent
在ios7中, 如果setTranslucent=yes 默认的 则状态栏及导航栏底部为透明的,界面上的组件应该从屏幕顶部开始显示,因为是半透明的,可以看到,所以为了不和状态栏及导航栏重叠,第一个 ...
- 关于fixed定位的一些错误看法纠正
之前由于一些误导,一直感觉fixed这个定位在ie8下面是会出现兼容问题的,今天发现这个想法太绝对了,它只是在ie7 8 的怪异模式下面会出现兼容问题 解决这个问题可以通过用absolute来模拟fi ...
- 子Repeater获取父级Repeater绑定项的值
原文发布时间为:2010-12-27 -- 来源于本人的百度文章 [由搬家工具导入] 1.子级Repeater中绑定父级的某个字段: <%# DataBinder.Eval((Container ...
- Access数据库访问类 帮助类
原文发布时间为:2009-10-28 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Data.OleDb; p ...