基于docker安装rabbitmq,php-amqp扩展

先创建目录:

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();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值