时间:2017-9-7来源:本站原创作者:佚名

RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。一般提到RabbitMQ和消息,都用到一些专有名词。

生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producr)。我们一般用”P”来表示:

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

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

HlloWorld!

我们的“Hlloworld”不会很复杂——仅仅发送一个消息,然后获取它并输出到屏幕。这样以来我们需要两个程序,一个用作发送消息,另一个接受消息并打印消息内容

我们大体的设计是这样的:

生产者(Producr)把消息发送到一个名为“hllo”的队列中。消费者(consumr)从这个队列中获取消息。

RabbitMQ库

RabbitMQ使用的是AMQP协议。要使用她你就必须需要一个使用同样协议的库。几乎所有的编程语言都有可选择的库。

发送消息

我们第一个程序snd.php会发送一个消息到队列中。首先要做的事情就是建立一个到RabbitMQ服务器的连接。

1$connction=nwAMQPConnction(array(host=17.0.0.1,port=,vhost=/,login=gust,password=gust));

现在我们已经连接上服务器了,那么,在发送消息之前我们需要确认队列是存在的。如果我们把消息发送到一个不存在的队列,RabbitMQ会丢弃这条消息。我门先创建一个名为hllo的队列,然后把消息发送到这个队列中。

1$quu=nwAMQPQuu($channl);$quu-stNam($quuNam);

这时候我们就可以发送消息了,我们第一条消息只包含了HlloWorld!字符串,我们打算把它发送到我们的hllo队列。

在RabbitMQ中,消息是不能直接发送到队列,它需要发送到交换器(xchang)中。现在我们所需要了解的是如何使用默认的交换器(xchang),它使用一个空字符串来标识。交换器允许我们指定某条消息需要投递到哪个队列,$routKy参数必须指定为队列的名称:

1$xchang-publish($mssag,$routKy);var_dump([x]SntHlloWorld!);

在退出程序之前,我们需要确认网络缓冲已经被刷写、消息已经投递到RabbitMQ。完成这些事情(正确的关闭连接)是很简单的。

1$connction-disconnct();获取数据

我们的第二个程序rciv.php,将会从队列中获取消息并打印消息。

这次我们还是先要连接到RabbitMQ服务器。连接服务器的代码和之前是一样的。

下一步也和之前一样,我们需要确认队列是存在的。使用$quu-dclar()创建一个队列——我们可以运行这个命令很多次,但是只有一个队列会创建。

1$quu=nwAMQPQuu($channl);$quu-stNam($quuNam);$quu-dclar();

你也许要问为什么重复声明了队列——我们已经在前面的代码中声明了它。如果我们确定了队列是已经存在的,那么我们可以不这么做。比如先运行snd.php程序。可是我们并不确定哪个程序先运行,这种情况的话再程序中重复声明是好的做法。

列出所有队列

你也许希望查看RabbitMQ由哪些队列、有多少消息在队列中。你可以使用rabbitmqctl工具(使用有权限的用户):

1$sudorabbitmqctllist_quusListingquus...hllo04...don.

(omitsudoonWindows)

(在Windows中不需要sudo命令)

从队列中获取消息相对来说稍显复杂。需要为队列定义一个回调(callback)函数。当我们获取到消息的时候,就会调用这个回调(callback)函数。我们的这个回调函数将会但因消息的内容到屏幕上。

1functioncallback($nvlop,$quu){$msg=$nvlop-gtBody();var_dump([x]Rcivd:.$msg);4$quu-nack($nvlop-gtDlivryTag());5}

下一步,我们需要告诉RabbitMQ这个回调函数将会从hllo队列中接收消息:

1$quu-consum(callback);

要成功运行这些命令,我们必须保证队列是存在的,我们已经能够保证——我们之前已经使用创建了一个队列quu_dclar。

$quu-nack()函数稍后会介绍。

最后,我们输入一个无限循环来等待消息数据并确运行回调函数。

1var_dump([*]Waitingformssags.ToxitprssCTRL+C);whil(TRUE){$quu-consum(callback);4}整合

snd.php的全部代码:

01?php00/**04*PHPamqp(RabbitMQ)Dmo-*

authoryuansiryuansir

liv.cn/yuansir-wb.







































鍖椾含娌荤枟鐧界櫆椋庣殑鍖婚櫌
鍖椾含涓鍖婚櫌鏄獥瀛?

转载请注明原文网址:http://www.coolofsoul.com/hjpz/16637.html
------分隔线----------------------------