docker搭建RabbitMQ並使用PHP操作

搭建RabbitMQ

開發環境 LNMP
docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.3-management
docker ps 查看RabbitMQ是否啓動

訪問RabbitMQ界面

容器運行正常,使用http://127.0.0.1:15672訪問rabbit控制檯
默認賬號guest 密碼guest

在這裏插入圖片描述

編譯安裝php的RabbitMQ擴展

  • 下載,解壓rabbitmq-c源碼
wget -c https://github.com/alanxz/rabbitmq-c/archive/v0.9.0.tar.gz
tar -zxvf v0.9.0.tar.gz
  • 配置,編譯,安裝
cd rabbitmq-c-0.9.0/
mkdir build && cd build #這一步是在rabbitmq-c的根目錄下創建一個build子目錄
# 這一步是讓cmake根據../CMakeList.txt,即rabbitmq-c的根目錄下的CMakeList.txt創建Makefile文件
# Makefile文件會被創建到build目錄中
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..
# 這一步是真正的build rabbitmq-c庫的,注意,不要漏掉點 '.'
cmake --build .  --target install
  • 庫軟連接
ln -s /usr/local/rabbitmq-c/lib64 /usr/local/rabbitmq-c/lib
  • 下載,解壓amqp
wget -c https://pecl.php.net/get/amqp-1.9.4.tgz
tar -zxvf amqp-1.9.4.tgz
cd amqp-1.9.4
/www/server/php/71/bin/phpize
./configure --with-php-config=/www/server/php/71/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c
make -j4
make install
php.ini添加 extension=amqp.so
重啓 php-fpm 查看是否安裝成功 php -m | grep amqp

php操作RabbitMQ

消費者代碼 consumer.php

<?php
//連接參數
$config = array(
    'host' => '192.168.254.128',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'guest',
    'password' => 'guest'
);
//連接broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
    echo "Cannot connect to the broker";
    exit();
}

//在連接內創建一個通道
$ch = new AMQPChannel($cnn);
//創建一個交換機
$ex = new AMQPExchange($ch);
//聲明路由鍵
$routingKey = 'key_1';
//聲明交換機名稱
$exchangeName = 'exchange_1';
//設置交換機名稱
$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();
//創建一個消息隊列
$q = new AMQPQueue($ch);
//設置隊列名稱
$q->setName('queue_1');
//設置隊列持久
$q->setFlags(AMQP_DURABLE);
//聲明消息隊列
$q->declareQueue();
//交換機和隊列通過$routingKey進行綁定
$q->bind($ex->getName(), $routingKey);
//接收消息並進行處理的回調方法
function receive($envelope, $queue) {
    //休眠兩秒,
    sleep(2);
    echo $envelope->getBody()."\n";
    //顯式確認,隊列收到消費者顯式確認後,會刪除該消息
    $queue->ack($envelope->getDeliveryTag());
}
//設置消息隊列消費者回調方法,並進行阻塞
$q->consume("receive");

運行消費者代碼 php consumer.php

在這裏插入圖片描述

生產者代碼publisher.php

<?php
$config = array(
    'host' => '192.168.254.128',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'guest',
    'password' => 'guest'
);
//創建一個新的連接, 連接到broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
    echo "Cannot connect to the broker";
    exit();
}
$ch = new AMQPChannel($cnn);
$ex = new AMQPExchange($ch);
//消息的路由鍵,一定要和消費者端一致
$routingKey = 'key_1';
//交換機名稱,一定要和消費者端一致,
$exchangeName = 'exchange_1';
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange();
//創建20個消息
for ($i=1;$i<=20;$i++){
    //消息內容
    $msg = array(
        'data'  => 'message_'.$i,
        'hello' => 'world',
    );
    //發送消息到交換機,並返回發送結果
    //delivery_mode:2聲明消息持久,持久的隊列+持久的消息在RabbitMQ重啓後纔不會丟失
    echo "Send Message:".$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, array('delivery_mode' => 2))."\n";
    //代碼執行完畢後進程會自動退出
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章