RabbitMQ 是什麼
- RabbitMQ 是一套訊息佇列 message queue/broker 工具
- 通常用於大量資料傳輸,不會/能馬上被消化的,暫時存放的一個地方
- 像是電子商務的訂單系統,用於應付大量的訂購資連線,不致於網站一直掛掉
這邊不提及它的架構,只來看怎麼安裝、傳送、接收
而且不讓網站掛掉,RabbitMQ 也只是其中一個解決方案,不是用了就萬能不掛的
RabbitMQ 怎麼安裝
yum -y install epel-release yum -y install rabbitmq-server
啟動
systemctl start rabbitmq-server systemctl enable rabbitmq-server
安裝管理介面 (後 restart rabbitmq-server)
rabbitmq-plugins enable rabbitmq_management
建立使用者
rabbitmqctl add_user admin 123456
給最高權限
rabbitmqctl set_user_tags admin administrator
權限可以修改、寫入、讀取
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
刪除預設的使用者 guest
rabbitmqctl delete_user guest
查看現有使用者
rabbitmqctl list_users
用 admin/123456 登入 (可看統計資料、與管理)
http://1.1.1.1:15672/
查看 queue
rabbitmqctl list_queues
(以上也可以直接 docker ↓)
RabbitMQ 也可以使用 docker 安裝
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management
RabbitMQ 怎麼使用
寫兩支 PHP 程式,一支是 sender.php (Producer) 負責傳送 (送到 RabbitMQ 裡),一支 receiver.php (Consumer (Worker)) 負責接收 (從 RabbitMQ 裡抓出來)
這邊的接收 receiver.php 並不是說用 sender.php 打資料到 receiver.php ,而是 sender.php 送 1 給 RabbitMQ 後, receiver.php 從 RabbitMQ 裡抓出取得到 1,然後 RabbitMQ 裡就看不到 1 了
參考 https://www.rabbitmq.com/getstarted.html
先安裝 php
yum install php php-bcmath -y
安裝 RabbitMQ php library
curl -sS https://getcomposer.org/installer | php -d allow_url_fopen=on mv composer.phar /usr/local/bin/composer composer require php-amqplib/php-amqplib
vi sender.php
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPStreamConnection('localhost', 5672, 'admin', '123456'); $channel = $connection->channel(); $data = implode(' ', array_slice($argv, 1)); if (! $data) { echo $argv[0] . " 'message'\n"; exit; } $channel->queue_declare('data', false, false, false, false); $msg = new AMQPMessage($data); $channel->basic_publish($msg, '', 'data'); echo " [x] Sent $data\n"; $channel->close(); $connection->close();
vi receiver.php
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('localhost', 5672, 'admin', '123456'); $channel = $connection->channel(); $channel->queue_declare('data', false, false, false, false); echo ' [*] Waiting for messages. To exit press CTRL+C', "\n"; $callback = function($msg) { echo " [x] Received ", $msg->body, "\n"; }; $channel->basic_consume('data', '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close();
執行送資料 (php 後面接的就是資料值)
php sender.php "$(date +%F.%T)"
執行取資料
php receiver.php
留言