tinkphp -rabbitmq的基本用法 2019-01-01

    前面两张介绍了rabbitMQ的安装,以及php扩展amqp。那么这一张我们需要来学习下rabbitmq在thinkphp下如何调用。

    我这边是thinkphp5.1版本,然后大家自行下载composer(到composer下载,安装指南https://jingyan.baidu.com/article/7082dc1c061948e40a89bdbb.html)下载tp5.1也得用到composer或者git ,具体安装tp5.1这里不再介绍自行看tp5.1文档。


    1. 安装依赖。

      cmd进入我们php项目的vendor,然后输入命令 composer require php-amqplib/php-amqplib 下载安装amqp依赖。



    2. <?php
      
      namespace app\home\controller;
      
      /**
       * 我的入口文件是 根目录/public/home/index.php 
       * 正常大家下载下来应该是根目录/public/index.php 
       * 那么就输入 ../vendor/autoload.php
       */
      require_once '../../vendor/autoload.php';
      
      class Index {
      
          public function index() {
              phpinfo();
          }
      
          public static function sendMsg() {
              $exchange = $queue = 'queue';
              $connection = new \PhpAmqpLib\Connection\AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest', '/');
              $channel = $connection->channel();
              $channel->queue_declare($queue, false, false, false, false);
              $data = [
                  '1' => 111,
                  'x' => 123
              ];
              $msg = new \PhpAmqpLib\Message\AMQPMessage(json_encode($data));
              $channel->basic_publish($msg, '', $exchange);
              $channel->close();
              $connection->close();
              echo " ok";
          }
      
      }

    3.上面代码是把$data 里面的数据存入到队列里面去。我们执行一下试试(执行了下报错。)

    image.png

        我们到 F:\yadmin\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\IO\StreamIO.php的88行  把这个常量修改为11.

        image.png

    4.然后我们再执行一下 返回OK,然后我们去查看下rabbitmq的后台。选择queues

    image.png

    然后就看到一条为queue的队列 多刷新几遍他就多入几次队列。(代码里面的参数大家会用了自行修改成自己的逻辑,甚至研究下mq的其他功能)


    5.消费队列掉队列

        既然消息已入队,我们就得来消耗一下队列的内容咯。代码如下(我目前写在同一个文件里)

        /**
         * 消费端
         */
        public function receiveMsg() {
            $connection = new \PhpAmqpLib\Connection\AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest', '/');
            $channel = $connection->channel();
            $channel->queue_declare('queue', false, false, false, false);
            echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
            $callback = function($msg) {
                echo " [x] Received ", "\n";
                dump($msg->body);
                echo "\n";
            };
            $channel->basic_consume('queue', '', false, true, false, false, $callback);
            while (count($channel->callbacks)) {
                $channel->wait();
            }
        }


    6.通过命令行执行该方法

        我们用cmd进入入口文件(根目录/public/home),然后输入php index.php index/receiveMsg

        意思是 使用php 执行 indedx.php 然后传递参数 index/receiveMsg  相当于 http://ip/index/receiveMsg 

        如果没报错基本就是对的,我上面插入了2条队列,那么会有两条处理队列的消息 如下图:

        image.png


    OK,队列使用基本就是这样。大家不妨多去看看php的amqp依赖怎么用。rabbitmq支持的场景很多。如下(出自百度百科):

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。

    特点:MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。

    使用场景:在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。


    谢谢。 过两天闲了再除centos7安装mq的文章,,,看情况吧。我们开发者很多人使用win系统,所以出了win的安装文档。但是代码层的基本一致。执行消费端的话甚至可以放到守护进程里面跑。对了,大家可以把消费端丢尽tp5的命令行模式里面去执行(参考官方文档:https://www.kancloud.cn/manual/thinkphp5_1/354146)