安裝rabbitmq和php擴展

一、安裝rabbitmq服務(wù)端

1、安裝erlang

試了幾次erlang官方的包安裝后,在安裝rabbitmq時都報錯要依賴R14B02,干脆使用rabbitmq官方提供的包:https://github.com/rabbitmq/erlang-rpm 點擊下載,終于不報錯了。

rabbitmq官方提供安裝包的步驟:
1、下載后進入安裝包,直接輸入命令:make
2、安裝過程需要3分鐘左右,編譯過程中需要用到rpm-build和autoconf,沒有安裝的需要安裝。安裝完成后,會在目錄RPMS/x86_64/下找到erlang的安裝包,rpm -ivh *** 安裝即可。

2、安裝rabbitmq

我直接使用rabbitmq 的rpm安裝包。如果這時還報錯socat找不到,下載socat 的安裝包安裝即可。
注意:如果使用yum安裝socat,需安裝epel。

3、測試rabbitmq是否安裝成功
service rabbitmq-server start #開啟rabbitmq
service rabbitmq-server status #查看rabbitmq狀態(tài)

二、安裝rabbitmq的php擴展

1、安裝擴展依賴庫#####

注意:擴展是C寫的,由于C與RabbitMQ通信一般需要依賴rabbitmq-c庫(也就是librabbitmq),所以編譯擴展前需要先裝依賴庫。不同版本的擴展,對php版本和librabbitmq兼容性不一樣。
rabbitmq-c依賴庫下載: https://github.com/alanxz/rabbitmq-c/archive/v0.8.0.tar.gz

mkdir build && cd build # 這一步是在rabbitmq-c的根目錄下創(chuàng)建一個build子目錄
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/librabbitmq ..  # 這一步是讓cmake根據(jù)../CMakeList.txt,即rabbitmq-c的根目錄下的CMakeList.txt創(chuàng)建Makefile文件,Makefile文件會被創(chuàng)建到build目錄中
cmake --build . # 這一步是真正的build rabbitmq-c庫的,注意,不要漏掉結(jié)尾的點 '.'
make
make install

2、安裝amqp擴展

amqp擴展下載: http://pecl.php.net/get/amqp-1.9.0.tgz

tar zvxf amqp-1.9.0.tgz #解壓
cd amqp-1.9.9 #打開目錄

./configure --with-php-config=/usr/local/php56/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/librabbitmq

make
make install

修改php.ini

extension=amqp.so #extension_dir自己定義

重啟php-fpm

service php-fpm restart #重啟

如無意外,則可以在phpinfo頁面看到如下所示:

圖一

三、監(jiān)控及代碼測試

啟動rabbitmq監(jiān)控頁面

rabbitmq-plugins enable rabbitmq_management #啟動監(jiān)控頁面插件

生產(chǎn)者代碼 (創(chuàng)建一個rabbit_publisher.php的文件)
創(chuàng)建連接-->創(chuàng)建channel-->創(chuàng)建交換機對象-->發(fā)送消息

<?php 
//配置信息
$conn_args = array(
    'host' => '192.168.1.93',
    'port' => '5672',
    'login' => 'guest',
    'password' => 'guest',
    'vhost'=>'/'
);
$e_name = 'e_linvo'; //交換機名
//$q_name = 'q_linvo'; //無需隊列名
$k_route = 'key_1'; //路由key

//創(chuàng)建連接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//消息內(nèi)容
$message = "TEST MESSAGE! 測試消息!";

//創(chuàng)建交換機對象
$ex = new AMQPExchange($channel);
$ex->setName($e_name);

//發(fā)送消息
//$channel->startTransaction(); //開始事務(wù)
for($i=0; $i<5; ++$i){
    echo "Send Message:".$ex->publish($message, $k_route)."\n";
}
//$channel->commitTransaction(); //提交事務(wù)

$conn->disconnect();

消費者代碼(創(chuàng)建一個rabbit_consumer.php的文件)
創(chuàng)建連接-->創(chuàng)建channel-->創(chuàng)建交換機-->創(chuàng)建隊列-->綁定交換機/隊列/路由鍵-->接收消息

<?php 
//配置信息
$conn_args = array(
    'host' => '192.168.1.93',
    'port' => '5672',
    'login' => 'guest',
    'password' => 'guest',
    'vhost'=>'/'
);
$e_name = 'e_linvo'; //交換機名
$q_name = 'q_linvo'; //隊列名
$k_route = 'key_1'; //路由key

//創(chuàng)建連接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//創(chuàng)建交換機
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";

//創(chuàng)建隊列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declare()."\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應(yīng)答
}
$conn->disconnect();

/**
* 消費回調(diào)函數(shù)
* 處理消息
*/
function processMessage($envelope, $queue) {
    $msg = $envelope->getBody();
    echo $msg."\n"; //處理消息
    $queue->ack($envelope->getDeliveryTag()); //手動發(fā)送ACK應(yīng)答
}

/**
 * 消費回調(diào)函數(shù)
 * 處理消息
 */
function processMessage($envelope, $queue) {
    var_dump($envelope->getRoutingKey);
    $msg = $envelope->getBody();
    echo $msg."\n"; //處理消息
}

需要注意的地方是:
queue對象有兩個方法可用于取消息:consume和get。前者是阻塞的,無消息時會被掛起,適合循環(huán)中使用;
后者則是非阻塞的,取消息時有則取,無則返回false。
測試截圖
運行消費者:


運行生產(chǎn)者,發(fā)消息:


消費者接收到消息:


執(zhí)行兩個文件,再打開RabbitMQ的管理中心 http://127.0.0.1:15672/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容