tinkphp -rabbitmq的基本用法 2019-01-01
安装依赖。
cmd进入我们php项目的vendor,然后输入命令 composer require php-amqplib/php-amqplib 下载安装amqp依赖。
<?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"; } }
前面两张介绍了rabbitMQ的安装,以及php扩展amqp。那么这一张我们需要来学习下rabbitmq在thinkphp下如何调用。
我这边是thinkphp5.1版本,然后大家自行下载composer(到composer下载,安装指南https://jingyan.baidu.com/article/7082dc1c061948e40a89bdbb.html)下载tp5.1也得用到composer或者git ,具体安装tp5.1这里不再介绍自行看tp5.1文档。
3.上面代码是把$data 里面的数据存入到队列里面去。我们执行一下试试(执行了下报错。)
我们到 F:\yadmin\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\IO\StreamIO.php的88行 把这个常量修改为11.
4.然后我们再执行一下 返回OK,然后我们去查看下rabbitmq的后台。选择queues
然后就看到一条为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条队列,那么会有两条处理队列的消息 如下图:
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)