一、下載
1.下載Erlang環境
https://www.erlang.org/downloads

2.下載Rabbitmq-server
https://www.rabbitmq.com/install-windows.html
二、安裝
先安裝Erlang,再安裝rabbitmq-server,一直下一步即可。安裝完之后使用cmd進入RabbitMQ Server文件下的sbin目錄,執行:
rabbitmq-plugins enable rabbitmq_management

打開瀏覽器,輸入localhost:15672,出現如下界面則安裝成功。

默認賬號:guest
默認密碼:guest
我們創建個admin管理員賬號:

以admin管理員登錄創建個test_host:


三、Hello World
這里我以Yii框架為例介紹如何使用RabbitMQ,需要使用composer下載php-amqplib。
composer require php-amqplib/php-amqplib
生產者:
<?php namespace app\commands; use yii\console\Controller; use PhpAmqpLib\Message\AMQPMessage; use PhpAmqpLib\Connection\AMQPStreamConnection; class ProductController extends Controller { public function actionIndex() { $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host'); $channel = $conn->channel(); $msgBody = 'Hello White Rabbit!'; $msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]); //聲明一個隊列,所有的參數會在下一篇文章介紹 $channel->queue_declare('white', false, true, false, false, false); //將消息發送到隊列,這里並不是直接將消息發送到隊列,而是通過交換機間接發送到隊列 $channel->basic_publish($msg, '', 'white'); echo "product: send msg success\n"; } }
控制台:
php yii product

RabbitMQ出現了一個white隊列,里面有一條消息未被消費:

消費者:
<?php namespace app\commands; use yii\console\Controller; use PhpAmqpLib\Connection\AMQPStreamConnection; class ConsumeController extends Controller { public function actionIndex() { $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host'); $channel = $conn->channel(); $callback = function ($msg) { if (true) { echo "consume: " . $msg->body . "\n"; //確認消費 $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); } else { //進行回滾操作 } }; /* * prefetch_count = 1,一次只消費一條消息 * no_ack = false,消費成功后回復ack */ $channel->basic_qos(null, 1, null); $channel->queue_declare('white', false, true, false, false, false); $channel->basic_consume('white', '', false, false, false, false, $callback); while (count($channel->callbacks)) { $channel->wait(); } } }
控制台:
php yii consume

此時white隊列中的一條消息已經被消費:

