mac 下安裝rabbitmq 和配置php擴充套件
看到網上大部分都是需要先安裝很多下載工具,感覺麻煩,我mac 上一直都僅用homebrew 管理和安裝第三方的。這裡分享一下步驟:
安裝rabbitmq 方式: brew install rabbitmq
安裝成功後可以先啟動前臺任務:rabbitmq-server ,不要關閉該終端視窗
可以使用瀏覽器登入rabbitmq 檢視:http://localhost:15672 這裡一定是localhost 不要用127.0.0.1,賬號密碼都是guest
以上說明安裝rabbitmq 成功,下面開始安裝php擴充套件
php中的rabbitmq 擴充套件是amqp ,而amqp依賴於rabbitmq-c ,首先需要安裝rabbitmq-c
brew install rabbitmq-c
安裝成功後,進入php 的安裝目錄中的bin 資料夾使用pecl 安裝amqp:
curl 'http://pecl.php.net/get/amqp-1.9.3.tgz' -o amqp-1.9.3.tgz
sudo ./pecl install amqp-1.9.3.tgz
直至出現Set the path to librabbitmq install prefix [autodetect]
使用brew install rabbitmq-c 查詢這個path,然後paste到終端。然後回車,這時候啥也不用做,知道其提示成功。
重啟php-fpm
開啟pathinfo(); 搜尋amqp 可以看到已經有這個可擴充套件了。
注意:1、如果rabbitmq-server 提示命令不存在,那麼需要將該安裝檔案下的bin目錄放到~/.bash_profile 裡
2、因為mac中本身帶的有個php版本,如果自己再安裝可能存在多個php版本,注意擴充套件安裝對應的版本
3、擴充套件安裝成功後,可以看到在php.ini裡已經有extension=amqp.so 了,如果沒有,自己新增一下
4、如果pathinfo()裡沒有,注意重新整理,或者檢查剛才哪一步是否有安裝錯誤。如果沒有,你的php是否重啟,或當前版本是否對應?檢查一下。
測試程式碼:
生產者:
//配置資訊
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_meng'; //交換機名
//$q_name = 'q_meng'; //無需佇列名
$k_route = 'key_meng'; //路由key
//建立連線和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//建立交換機物件
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
date_default_timezone_set("Asia/Shanghai");
//傳送訊息
//$channel->startTransaction(); //開始事務
for($i=0; $i<5; ++$i){
sleep(1);//休眠1秒
//訊息內容
$message = "TEST MESSAGE!".date("h:i:sa");
echo "Send Message:".$ex->publish($message, $k_route)."\n";
}
//$channel->commitTransaction(); //提交事務
$conn->disconnect();
消費者:
//配置資訊
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_meng'; //交換機名
$q_name = 'q_meng'; //佇列名
$k_route = 'key_meng'; //路由key
//建立連線和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//建立交換機
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct型別
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declareExchange()."\n";
//建立佇列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declareQueue()."\n";
//繫結交換機與佇列,並指定路由鍵
echo 'Queue Bind: '.$q->bind($e_name, $k_route)."\n";
//阻塞模式接收訊息
echo "Message:\n";
while(True){
$q->consume('processMessage');
//$q->consume('processMessage', AMQP_AUTOACK); //自動ACK應答
}
$conn->disconnect();
/**
* 消費回撥函式
* 處理訊息
*/
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg."\n"; //處理訊息
$queue->ack($envelope->getDeliveryTag()); //手動傳送ACK應答
}
測試程式碼可以分兩部分,注意開啟rabbitmq程序,然後執行消費者程式碼和生產者程式碼,可以看到當有訊息進入佇列,消費者會將訊息不斷打印出來,可以更好理解的使用訊息佇列的解耦、消峰等優點。實際專案中可以參考測試程式碼進一步封裝處理。
不過我們一般不自己寫,可以使用composer 去整合一下第三方: