先创建目录:
mkdir /usr/local/software/RabbitMQ
cd /usr/local/software/RabbitMQ
创建 docker-compose.yml 文件
version: '3'
services:
rabbitmq:
image: rabbitmq:latest
container_name: rabbitmq
restart: always
hostname: myRabbitmq
ports:
- 15672:15672
- 5672:5672
volumes:
- $PWD/data:/var/lib/rabbitmq
#environment:
# - RABBITMQ_DEFAULT_USER=root
# - RABBITMQ_DEFAULT_PASS=root
执行:
docker-compose up -d
查看:
验证rabbitmq安装是否成功
curl localhost:5672 --output run.log |cat run.log
如果看到输出AMQP,说明RabbitMQ已经安装成功了。
开启图形化界面
进入容器内部:
docker exec -it rabbitmq /bin/bash
进入rabbitmq默认安装目录:
cd /opt/rabbitmq/sbin
开启图形化管理界面:
./rabbitmq-plugins enable rabbitmq_management
开启成功如下图:
之后可以通过Ip:15672端口访问图形化界面,
默认账号:guest
默认密码:guest
php-fpm安装amqp扩展
第一种:
更新:apt-get update
安装:apt-get install librabbitmq-dev
下载amqp扩展:https://pecl.php.net/package/amqp
安装wget:apt install wget
下载:wget https://pecl.php.net/get/amqp-1.11.0.tgz
解压:tar zxf amqp-1.11.0.tgz
下载php扩展源码:docker-php-source extract
amqp更换目录:mv amqp-1.11.0 /usr/src/php/ext/amqp
安装amqp扩展:docker-php-ext-install amqp
第一种:
安装:apt-get install librabbitmq-dev
使用pecl search amqp搜索出来,执行安装pecl install amqp 1.9.3(需要自行配置php.ini)
laravel中使用rabbitmq
1.拉取composer包
composer require vladimir-yuldashev/laravel-queue-rabbitmq
2.在laravel的 config/queue.php 文件中配置信息
'rabbitmq' => [
'driver' => 'rabbitmq',
'queue' => env('RABBITMQ_QUEUE', 'default'),
'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class,
'hosts' => [
[
'host' => env('RABBITMQ_HOST', '127.0.0.1'),
'port' => env('RABBITMQ_PORT', 5672),
'user' => env('RABBITMQ_USER', 'guest'),
'password' => env('RABBITMQ_PASSWORD', 'guest'),
'vhost' => env('RABBITMQ_VHOST', '/'),
],
],
'options' => [
'ssl_options' => [
'cafile' => env('RABBITMQ_SSL_CAFILE', null),
'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
],
'queue' => [
'job' => \VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class,
]
],
/*
* Set to "horizon" if you wish to use Laravel Horizon.
*/
'worker' => env('RABBITMQ_WORKER', 'default'),
]
3…env文件配置
.env文件中
# 默认使用rabbitmq队列
QUEUE_CONNECTION=rabbitmq
# 使用的队列驱动
QUEUE_DRIVER=rabbitmq
# mq的ip地址
RABBITMQ_HOST=172.17.0.10
# mq的端口
RABBITMQ_PORT=5672
# mq的账号
RABBITMQ_USER=admin
# mq的密码
RABBITMQ_PASSWORD=admin
# 默认的虚拟主机
RABBITMQ_VHOST=my_vhost
# 默认队列名称
RABBITMQ_QUEUE=test
测试demo
1 . 创建连接类 connection.php,封装连接方法
<?php
$config = array(
'host' => '172.17.0.5',
'vhost'=> 'my_vhost', //设置虚拟机,相当于mysql的库
'port' => 5672,
'login'=> 'admin',
'password' => 'admin'
);
try {
//创建AMQP对象
$cnn = new AMQPConnection($config);
//连接MQbroker
if (!$cnn->connect()) {
echo 'Cannot connect to the broker';
exit();
}
//在连接内创建一个通道
$ch = new AMQPChannel($cnn);
//创建一个交换机
$ex = new AMQPExchange($ch);
//设置交换机名称
$ex->setName($exchangeName);
/**
* 设置交换机类型
* AMQP_EX_TYPE_DIRECT:直连交换机
* AMQP_EX_TYPE_FANOUT:扇形交换机
* AMQP_EX_TYPE_HEADERS:头交换机
* AMQP_EX_TYPE_TOPIC:主题交换机
*/
$ex->setType(AMQP_EX_TYPE_DIRECT);
//设置交换机持久化
$ex->setFlags(AMQP_DURABLE);
//声明交换机
$ex->declareExchange();
} catch (AMQPConnectionException $e) {
echo '创建连接异常:'.$e->getMessage();
exit();
} catch (AMQPExchangeException $e) {
echo '创建交换机异常:'.$e->getMessage();
exit();
} catch (AMQPChannelException $e) {
echo '创建通道异常:'.$e->getMessage();
exit();
}
2 . 新建consumer.php 消费者
<?php
//声明一个路由键
$routingKey = 'key_1';
//设置一个交换机名称
$exchangeName = 'exchange_1';
//声明交换机
try {
include 'connection.php';
//创建一个消息队列
$q = new AMQPQueue($ch);
//设置队列名称
$q->setName('queue_1');
//设置队列持久化
$q->setFlags(AMQP_DURABLE);
//声明消息队列
$q->declareQueue();
//交换机和队列通过$routingKey进行绑定
$q->bind($ex->getName(),$routingKey);
//接受消息并进行处理的回调方法
function recevie($envelope,$queue){
sleep(0.01);
//显示消息
echo $envelope->getBody().PHP_EOL;
//处理业务逻辑;
//ack确认,队列收到消费者确认后,会删除消息
$queue->ack($envelope->getDeliveryTag());
}
//设置消息队列消费者回调方法
$q->consume('recevie');
} catch (AMQPConnectionException $e) {
echo '创建连接异常:'.$e->getMessage();
exit();
} catch (AMQPChannelException $e) {
echo '创建通道异常:'.$e->getMessage();
exit();
} catch (AMQPQueueException $e) {
echo '创建消息队列异常:'.$e->getMessage();
exit();
} catch (AMQPEnvelopeException $e) {
echo '消息消费异常:'.$e->getMessage();
exit();
}
3 . 新建producer.php 生产者
<?php
//声明一个路由键
$routingKey = 'key_1';
//设置一个交换机名称
$exchangeName = 'exchange_1';
include 'connection.php';
//创建是个消息
for($i = 1;$i <= 100000; $i++){
$msg = array(
'data' => 'message_'.$i,
'hello'=> 'world'
);
//发送消息到交换机,并返回f发送结果
//delivery_mode:2声明消息持久,持久的队列 + 持久的消息在rabbitmq重启后不会消失
//代码执行完毕后进程会自动退出
try {
echo "Send Message:" . $ex->publish(json_encode($msg), $routingKey
, AMQP_NOPARAM, array('delivery_mode' => 2)) . "\n";
} catch (AMQPChannelException $e) {
echo '创建消息通道异常:'.$e->getMessage();
exit();
} catch (AMQPConnectionException $e) {
echo '创建连接异常:'.$e->getMessage();
exit();
} catch (AMQPExchangeException $e) {
echo '创建交换机异常:'.$e->getMessage();
exit();
}
}