Mac安裝RabbitMQ直接用
brew install rabbitmq
安裝php擴(kuò)展麻煩在于需要很多依賴
PHP 使用 AMQP 協(xié)議來連接 Rabbitmq徒恋, AMQP 協(xié)議即 “Advanced Message Queuing Protocol ”辕近,高級(jí)消息隊(duì)列協(xié)議封孙。
使 PHP 支持 AMQP 協(xié)議迹冤,需要安裝:
- rabbitmq 的客戶端 C 類庫 rabbitmq-c
- PHP 官方提供的 AMQP 擴(kuò)展 https://pecl.php.net/package/amqp phper必備網(wǎng)址 我在此選擇的是 amqp-1.9.3.tgz版本
我都是編譯安裝的方法
- 首先安裝rabbitmq-c
wget -c https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz
tar zxvf rabbitmq-c-0.8.0.tar.gz
cd rabbitmq-c-0.8.0
./configure --prefix=/usr/local/rabbitmq-c-0.8.0
make && make install
- 其次安裝amqp
wget -c http://pecl.php.net/get/amqp-1.9.3.tgz
tar zxf amqp-1.9.3.tgz
cd amqp-1.9.3
#我電腦環(huán)境有多php環(huán)境所以指定版本 下面的config如是
/usr/local/Cellar/php@7.2/7.2.26/bin/phpize
./configure --with-php-config=/usr/local/Cellar/php@7.2/7.2.26/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0
make && make install
問題來了
我在編譯的時(shí)候反復(fù)出現(xiàn)如下錯(cuò)誤,開始以為是我弄丟了文件虎忌,重復(fù)刪除泡徙、解壓。
image.png
問題原因就是找不到 amqp_ssl_socket.h 文件
解決辦法也很簡單膜蠢,找到這個(gè)文件在你電腦的位置锋勺,復(fù)制一份到當(dāng)前目錄就OK蚀瘸,然后繼續(xù)重新make && make install 就可以
image.png
然后,將你的amqp.so放到你的php.ini里 extension=amqp.so
image.png
重啟你的php 開始coding吧
在你的環(huán)境下創(chuàng)建一個(gè)consume.php
<?php
//聲明連接參數(shù)
$config = array(
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
);
//連接broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
//在連接內(nèi)創(chuàng)建一個(gè)通道
$ch = new AMQPChannel($cnn);
//創(chuàng)建一個(gè)交換機(jī)
$ex = new AMQPExchange($ch);
//聲明路由鍵
$routingKey = 'key_1';
//聲明交換機(jī)名稱
$exchangeName = 'exchange_1';
//設(shè)置交換機(jī)名稱
$ex->setName($exchangeName);
//設(shè)置交換機(jī)類型
//AMQP_EX_TYPE_DIRECT:直連交換機(jī)
//AMQP_EX_TYPE_FANOUT:扇形交換機(jī)
//AMQP_EX_TYPE_HEADERS:頭交換機(jī)
//AMQP_EX_TYPE_TOPIC:主題交換機(jī)
$ex->setType(AMQP_EX_TYPE_DIRECT);
//設(shè)置交換機(jī)持久
$ex->setFlags(AMQP_DURABLE);
//聲明交換機(jī)
$ex->declareExchange();
//創(chuàng)建一個(gè)消息隊(duì)列
$q = new AMQPQueue($ch);
//設(shè)置隊(duì)列名稱
$q->setName('queue_1');
//設(shè)置隊(duì)列持久
$q->setFlags(AMQP_DURABLE);
//聲明消息隊(duì)列
$q->declareQueue();
//交換機(jī)和隊(duì)列通過$routingKey進(jìn)行綁定
$q->bind($ex->getName(), $routingKey);
//接收消息并進(jìn)行處理的回調(diào)方法
function receive($envelope, $queue) {
//休眠兩秒庶橱,
sleep(2);
//echo消息內(nèi)容
echo $envelope->getBody()."\n";
//顯式確認(rèn)贮勃,隊(duì)列收到消費(fèi)者顯式確認(rèn)后,會(huì)刪除該消息
$queue->ack($envelope->getDeliveryTag());
}
//設(shè)置消息隊(duì)列消費(fèi)者回調(diào)方法苏章,并進(jìn)行阻塞
$q->consume("receive");
//$q->consume("receive", AMQP_AUTOACK);//隱式確認(rèn),不推薦
然后寂嘉,我在終端開啟三個(gè)進(jìn)程
可以在圖形化中看見有三個(gè)消費(fèi)者在等待
image.png
perfect