RabbitMQ 入门教程(PHP版) 第一部分:Hello World
abbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。一般提到RabbitMQ和消息,都用到一些专有名词。
- 生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producer)。我们一般用”P”来表示:

- 队列(queue)就是邮箱的名称。消息通过你的应用程序和RabbitMQ进行传输,它们能够只存储在一个队列(queue)中。 队列(queue)没有任何限制,你要存储多少消息都可以——基本上是一个无限的缓冲。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能攻从一个队列(queue)中获取数据。队列可以化城这样(图上是队列的名称):

- 消费(Consuming)和获取消息是一样的意思。一个消费者(consumer)就是一个等待获取消息的程序。我们把它画作”C”:

发送消息

我们第一个程序send.php会发送一个消息到队列中。首先要做的事情就是建立一个到RabbitMQ服务器的连接。
$connection = new AMQPConnection(array('host' =>'127.0.0.1', 'port' =>'', 'vhost' =>'/', 'login' =>'guest', 'password' => 'guest'));
现在我们已经连接上服务器了,那么,在发送消息之前我们需要确认队列是存在的。如果我们把消息发送到一个不存在的队列,RabbitMQ会丢弃这条消息。我门先创建一个名为hello的队列,然后把消息发送到这个队列中。
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
这时候我们就可以发送消息了,我们第一条消息只包含了 Hello World!字符串,我们打算把它发送到我们的hello队列。
在RabbitMQ中,消息是不能直接发送到队列,它需要发送到交换器(exchange)中。我们不打算在这里深入讨论它——你可以通过教程第三部分了解更多。现在我们所需要了解的是如何使用默认的交换器(exchange),它使用一个空字符串来标识。交换器允许我们指定某条消息需要投递到哪个队列,$$routeKey参数必须指定为队列的名称:
$exchange->publish($message, $routeKey);
var_dump("[x] Sent 'Hello World!'");
在退出程序之前,我们需要确认网络缓冲已经被刷写、消息已经投递到RabbitMQ。完成这些事情(正确的关闭连接)是很简单的。
$connection->disconnect();
获取数据

我们的第二个程序receive.php,将会从队列中获取消息并打印消息。
这次我们还是先要连接到RabbitMQ服务器。连接服务器的代码和之前是一样的。
下一步也和之前一样,我们需要确认队列是存在的。使用$queue->declare(),新版为$queue->declareQueue()创建一个队列,我们可以运行这个命令很多次,但是只有一个队列会创建。
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
//$queue->declare();
$queue->declareQueue();
你也许要问为什么重复声明了队列——我们已经在前面的代码中声明了它。如果我们确定了队列是已经存在的,那么我们可以不这么做。比如先运行send.php程序。可是我们并不确定哪个程序先运行,这种情况的话再程序中重复声明是好的做法。
从队列中获取消息相对来说稍显复杂。需要为队列定义一个回调(callback)函数。当我们获取到消息的时候,Pika库就会调用这个回调(callback)函数。我们的这个回调函数将会但因消息的内容到屏幕上。
function callback($envelope, $queue) {
$msg = $envelope->getBody();
var_dump(" [x] Received:" . $msg);
$queue->nack($envelope->getDeliveryTag());
}
下一步,我们需要告诉RabbitMQ这个回调函数将会从hello队列中接收消息:
$queue->consume('callback');
要成功运行这些命令,我们必须保证队列是存在的,我们之前已经使用创建了一个队列queue_declare。
$queue->nack()//函数稍后会介绍。
最后,我们输入一个无限循环来等待消息数据并确运行回调函数。
var_dump('[*] Waiting for messages. To exit press CTRL+C');
while (TRUE) {
$queue->consume('callback');
}
整合代码
receive.php
<?php
$exchangeName = 'demo';
$queueName = 'hello';
$routeKey = 'hello'; $connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
$connection->connect() or die("Cannot connect to the broker!\n");
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
//$queue->declare();
$exchange->declareExchange();
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
//$queue->declare();
$queue->declareQueue();
$queue->bind($exchangeName, $routeKey); var_dump('[*] Waiting for messages. To exit press CTRL+C');
while (TRUE) {
$queue->consume('callback');
}
$connection->disconnect(); function callback($envelope, $queue) {
$msg = $envelope->getBody();
var_dump(" [x] Received:" . $msg);
$queue->nack($envelope->getDeliveryTag());
}
send.php
<?php $exchangeName = 'demo';
$queueName = 'hello';
$routeKey = 'hello';
$message = 'Hello World!'; $connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
$connection->connect() or die("Cannot connect to the broker!\n"); try {
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$exchange->publish($message, $routeKey);
var_dump("[x] Sent 'Hello World!'");
} catch (AMQPConnectionException $e) {
var_dump($e);
exit();
}
$connection->disconnect();
使用方法:先运行receive.php,再运行send.php
效果截图:

RabbitMQ 入门教程(PHP版) 第一部分:Hello World的更多相关文章
- RabbitMQ官方中文入门教程(PHP版) 第一部分:Hello World
RabbitMQ是一个消息代理.它的核心原理非常简单:接收和发送消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ是一个邮箱.邮局.邮 ...
- RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
发布/订阅 在上篇第二部分教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式 ...
- RabbitMQ 入门教程(PHP版) 第二部分:工作队列(Work queues)
工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序.在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Works ). 工作队列 ...
- RabbitMQ 入门教程(PHP版) 使用rabbitmq-delayed-message-exchange插件实现延迟功能
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- RabbitMQ 入门教程(PHP版) 延迟队列,延迟任务
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- RabbitMQ 入门教程(PHP版) 第四部分:路由(Routing)
路由(Routing) 在前面的第三部分教程中,我们实现了一个简单的日志系统.可以把日志消息广播给多个接收者. 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集.例如,我们只需要把严重 ...
- 转 RabbitMQ 入门教程(PHP版) 使用rabbitmq-delayed-message-exchange插件实现延迟功能
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- RabbitMQ 入门教程(PHP版) 简单Demo
RabbitMQ的关键字说明 (1)Broker:经纪人.提供一种传输服务,维护一条从生产者到消费者的传输线路,保证消息数据能按照指定的方式传输.粗略的可以将图中的RabbitMQ Server当作B ...
- RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...
随机推荐
- 适合于做项目与团队管理的工具(Choerodon)
官网链接:http://choerodon.io/zh/ 此处不做太多的介绍,需要了解的朋友进入官网进行查看. Choerodon猪齿鱼开源多云技术平台,是基于开源技术Kubernetes,Istio ...
- restful接口规范 | 基于restful的原生django接口
restful接口规范 接口 接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介 web接口组成: - url:长得像返回数据的url链接 - 请求参数:前台按照指定 ...
- Java - MyBites 逆向工程
逆向工程是什么呢? 说白了就是 mybatis 中提供了一个可以让你从 已经创建好的 数据库中,去通过表名,生成对应类,类属性和XML文件(sql语句). 源码:mybatis_AutoGenerat ...
- [TypeScript ] Using the Null Coalescing operator with TypeScript 3.7
The postshows you how to use the null coalescing operator (??) instead of logical or (||) to set def ...
- YAML_18 ansible 判断和循环
标准循环 模式一 - name: add several users user: name={{ item }} state=present groups=wheel with_items: - te ...
- 删除tppabs,href="javascript:if(confirm)...",、/*tpa=http://...
扒网站,据说是web从业人员的必备技能; 废话不多,下面应该是你想要的; 1: tppabs="h[^"]*" 2: href="javascript\:i ...
- 洛谷 P1613 跑路 题解
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
- 原创:Solr Wiki 中关于Suggester(搜索推荐)的简单解读
Solr Wiki Suggester Suggester - a flexible "autocomplete" component.(搜索推荐) A common nee ...
- 「SCOI2011」棘手的操作
传送门 Description 有\(N\)个节点,标号从\(1\)到\(N\),这\(N\)个节点一开始相互不连通.第$ i\(个节点的初始权值为\)a_i$ ,接下来有如下一些操作: U x y ...
- avalon结合原生js tab切换
<div class="fishqc-tap"> <div ms-class="[@codePic!=''&&@codeInfo!='' ...