Laravel5.2使用RabbitMQ初体验
由于最近需要使用rabbitmq来进行消息队列的读取,但以前从来都没有接触过这等高深的技术,所以只好从头开始研究,下面就把这几周的成果分享出来,针对没有接触过消息队列的同学,希望能给你们一些帮助。
- 安装rabbitmq
- 使用composer安装laravel的php-amqplib/php-amqblib包
- 推送消息到队列和读取队列中的消息
安装rabbit首先需要安装erlang环境,然后下载rabbitmq客户端进行安装,由于我实在windows环境下进行搭建的,所以过程很简单,这里就不直接介绍安装方法了,可以自行百度。安装完成之后记得使用命令行安装rabbitmq的浏览器插件,然后就可以在浏览器中看到rabbitmq的信息了。
文章图片
由于我研究的时间不是很长,所以这里面很多我也不是很清楚。这个Queues下面的列表代表着这个服务器上存在几个队列。
使用composer安装扩展
扩展地址
可以直接在composer.json文件中添加,然后执行composer update,也可以在命令行中执行composer require
文章图片
推送消息到rabbitmq中
Github上有详细的实例代码,我这里只是将其简化。
config.php
amqp_publisher.php
channel();
$channel->queue_declare($queue, false, true, false, false);
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_bind($queue, $exchange);
// 队列和交换器绑定
$messageBody = 'testinfo12';
// 要推送的消息
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
$channel->basic_publish($message, $exchange);
// 推送消息
$channel->close();
$connection->close();
执行完这段代码之后会发现rabbitmq的test队列会多出一个消息
文章图片
从rabbitmq中取出消息
在这里我使用的是github中demo中的basic_get.php中的方法,还有一种amqp_consumer.php方法,大家可以试试看。
basic_get.php
channel();
$message = $channel->basic_get($queue);
//取出消息
print_r($message->body);
$channel->basic_ack($message->delivery_info['delivery_tag']);
// 确认取出消息后会发送一个ack来确认取出来了,然后会从rabbitmq中将这个消息移除,如果删掉这段代码,会发现rabbitmq中的消息还是没有减少
$channel->close();
$connection->close();
在laravel中使用
因为我们需要实时监听这个消息队列中是否有消息,如果有就取出消息队列进行处理。
这里laravel提供了一个commad。
在项目目录下执行php artisan make:console GetMessage 这里的名字可以自己起
然后找到app/Console/Commands,会发现多出了一个GetMessage.php文件。
channel();
$channel->queue_declare($queue, false, true, false, false);
$message = $channel->basic_get($queue);
$channel->basic_ack($message->delivery_info['delivery_tag']);
if ($message->body) {
print_r($message->body);
\Log::info('queueInfo:' . $message->body);
}
$channel->close();
$connection->close();
}
在Console目录下的Kernel.php中添加
protected $commands = [
GetMessage::class,
// Commands\Inspire::class,
];
【Laravel5.2使用RabbitMQ初体验】在项目目录下执行
php artisan list
查看是否有这个命令 文章图片
如果操作正确会显示getMessage后面是一堆乱码,因为我的命令描述写的是中文。
然后在命令行中执行
php artisan getMessage
会发现rabbitmq中队列里的消息减少了一个,然后打开日志文件,会发现已经写进去了。那么怎么实时进行检测呢,只要使用linux自带的crontab不停的执行php artisan getMessage
就好了。推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小