搭建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";
//代碼執行完畢後進程會自動退出
}