1. 程式人生 > >mac 下安裝rabbitmq 和配置php擴充套件

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 去整合一下第三方: