簡介
RabbitMQ 是消息中間件,它主要負責接收、存儲和轉發(發送)消息。
預設端口為 5672。
消息指的是二進制的資料。
你可以把 RabbitMQ 看作是一個郵局,它包含信箱、郵差。
我們以 PHP 語言為例,來講解如何使用 RabbitMQ。
準備工作
環境要求
- PHP 的版本 >= 5.6
- PHP 的 bcmath 擴充(Windows 内置支援,Linux 需手動安裝)
- PHP 的 sockets 擴充(Windows 直接開啟,Linux 需手動安裝)
安裝 php-amqplib
使用 PHP 語言作為用戶端來操作 RabbitMQ,需要先在我們的應用(application)中安裝 php-amqplib API。
# 推薦使用 composer 來安裝
composer require php-amqplib/php-amqplib
或
composer require php-amqplib/php-amqplib:2.10.0
最簡單的示例 Hello World
我們來實作一個最簡單的消息發送和接收的例子。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iM2ADOmhTZkJDO0MzYilzMzcTYyAzYjVjMxQjYkVmMi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
首先,在應用(application) 目錄中,建立 send.php 檔案,作為消息的 Producer。
<?php
// php 的依賴包自動加載,引入相關的類
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// 連接配接到指定的 RabbitMQ 伺服器(Broker),并建立 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 聲明隊列(queue)
// queue_declare() 方法是幂等的,即隻有當指定的 queue 不存在時才會建立
$channel->queue_declare('hello', false, false, false, false);
// 建立消息
$msg = new AMQPMessage('Hello World!');
// 将消息發送到指定的隊列
$channel->basic_publish($msg, '', 'hello');
// 消息發送成功後,輸出提示資訊
echo " [x] Sent 'Hello World!'\n";
// 最後,關閉 channel 和 connection
$channel->close();
$connection->close();
這裡,我們以 PHP CLI 的方式,發送消息。
php send.php
其次,建立 receive.php 檔案,作為消息的 Consumer。
<?php
// php 的依賴包自動加載,引入相關的類
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// 連接配接到指定的 RabbitMQ 伺服器(Broker),并建立 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 聲明要監聽的隊列(queue)
$channel->queue_declare('hello', false, false, false, false);
// 提示資訊
echo " [*] Waiting for messages. To exit press CTRL+C\n";
// 回調函數
$callback = function ($msg) {
// todo 處理消息的業務邏輯
echo ' [x] Received ', $msg->body, "\n";
};
// 啟動消費者
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while ($channel->is_consuming()) { // 如果正在進行回調處理
$channel->wait(); // 等待
}
// 最後,關閉 channel 和 connection
$channel->close();
$connection->close();
運作 Consumer
php receive.php
說明: Producer 發送完一條消息後就會關閉退出,而 Consumer 可以一直運作,以便監聽 RabbitMQ 的 Queue 中的消息,并随時進行處理。
檢視消息清單
想要檢視 RabbitMQ 的隊列中,有多少條消息,可以使用下面的方式。
# Linux 中,已授權的使用者
sudo rabbitmqctl list_queues
# Windows 中,D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.17\sbin 目錄下
rabbitmqctl list_queues
輸出結果如下:
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
hello 2
當然,也可以使用 RabbitMQ 的可視化 Web 管理界面。
http://127.0.0.1:15672/#/queues
參考文獻
[1] https://www.rabbitmq.com/tutorials/tutorial-one-php.html