设为首页 收藏本站
查看: 1243|回复: 0

[经验分享] RabbitMQ官方中文入门教程(PHP版) 第一部分:Hello World

[复制链接]

尚未签到

发表于 2017-7-3 06:18:43 | 显示全部楼层 |阅读模式
  RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。一般提到RabbitMQ和消息,都用到一些专有名词。


  • 生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producer)。我们一般用”P”来表示: DSC0000.png
  • 队列(queue)就是邮箱的名称。消息通过你的应用程序和RabbitMQ进行传输,它们能够只存储在一个队列(queue)中。 队列(queue)没有任何限制,你要存储多少消息都可以——基本上是一个无限的缓冲。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能攻从一个队列(queue)中获取数据。队列可以化城这样(图上是队列的名称): DSC0001.png
  • 消费(Consuming)和获取消息是一样的意思。一个消费者(consumer)就是一个等待获取消息的程序。我们把它画作”C”: DSC0002.png

Hello World!

(使用pika 0.9.5 Python客户端)
  我们的“Hello world”不会很复杂——仅仅发送一个消息,然后获取它并输出到屏幕。这样以来我们需要两个程序,一个用作发送消息,另一个接受消息并打印消息内容
  我们大体的设计是这样的:
DSC0003.png

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


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


  • py-amqplib
  • txAMQP
  • pika
  在这一系列教程中,我们打算使用PHP 的AMQP扩展。详细教程请查看:

mac os 下RabbitMq 以及 PHP amqp扩展安装记录


发送消息
DSC0004.png

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

$connection = new AMQPConnection(array('host' =>'127.0.0.1', 'port' =>'5672', '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();

获取数据
DSC0005.png

  我们的第二个程序receive.php,将会从队列中获取消息并打印消息。
  这次我们还是先要连接到RabbitMQ服务器。连接服务器的代码和之前是一样的。
  下一步也和之前一样,我们需要确认队列是存在的。使用$queue->declare()创建一个队列——我们可以运行这个命令很多次,但是只有一个队列会创建。

$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->declare();

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


列出所有队列
  你也许希望查看RabbitMQ由哪些队列、有多少消息在队列中。你可以使用rabbitmqctl工具(使用有权限的用户):
  ``` $ sudo rabbitmqctl list_queues Listing queues ... hello 0 ...done.
  ```
  (omit sudo on Windows)
  (在Windows中不需要sudo命令)

  从队列中获取消息相对来说稍显复杂。需要为队列定义一个回调(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');
    }

    整合
      send.php的全部代码:

    <?php
    /**
    * PHP amqp(RabbitMQ) Demo-1
    * @author  yuansir &lt;yuansir@live.cn/yuansir-web.com>
    */
    $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.py的全部代码:

    <?php
    /**
    * PHP amqp(RabbitMQ) Demo-1
    * @author  yuansir &lt;yuansir@live.cn/yuansir-web.com>
    */
    $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);
    $exchange->declare();
    $queue = new AMQPQueue($channel);
    $queue->setName($queueName);
    $queue->declare();
    $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 send.php  
    string(23) "[x] Sent 'Hello World!'"</pre>

      生产者(producer)程序send.php每次运行之后就会停止。现在我们就来接收消息:

    php receive.php  
    string(46) "
  • Waiting for messages. To exit press CTRL+C"  
    string(26) " [x] Received:Hello World!"</pre>  

      成功了!我们已经通过RabbitMQ发送第一条消息。你也许已经注意到了,receive.py程序并没有退出。它一直在准备获取消息,你可以通过Ctrl-C来终端它。
      试下在新的终端中再次运行send.php。
      我们已经学会如何发送消息到一个已知队列中并接收消息。是时候移步到第二部分了,我们将会建立一个简单的工作队列(work queue)
      转载自Ryan是菜鸟 | LNMP技术栈笔记

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390578-1-1.html 上篇帖子: Spring boot + RabbitMQ 下篇帖子: RabbitMQ入门_02_HelloWorld
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表