1. 程式人生 > >初步對訊息佇列RabbitMQ的瞭解

初步對訊息佇列RabbitMQ的瞭解

RabbitMQ是流行的開源訊息佇列系統,用erlang語言開發,完整的實現了AMPQ(高階訊息佇列協議)。網站: http://www.rabbitmq.com/
erlang網站:http://www.erlang.org/ 中文站:http://www.erlang-cn.com/
首先,先安裝下RabbitMQ。
我們先來安裝下erlang:

wget http://www.erlang.org/download/otp_src_17.5.tar.gz
tar -zxvf otp_src_17.5.tar.gz
cd otp_src_17.5
./configure --prefix=/lnmp/erlang
make && make install


執行下/lnmp/erlang/bin/erl,結果如圖,表示安裝成功
erlang
接下來安裝RabbitMQ(https://www.rabbitmq.com/install-generic-unix.html):

wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-generic-unix-3.5.1.tar.gz
tar -zxvf rabbitmq-server-generic-unix-3.5.1.tar.gz
cp -r rabbitmq_server-3.5.1/ /lnmp/rabbitmq

修改下使用者目錄下.bash_profile,將/lnmp/erlang/bin加入到PATH裡面

PATH=$PATH:$HOME/bin:/lnmp/php/bin:/lnmp/java/bin:/lnmp/imagemagick/bin:/lnmp/erlang/bin

然後重新呼叫一下,使其生效

source ~/.bash_profile
/lnmp/rabbitmq/sbin/rabbitmq-server -detached #啟動rabbitmq
/lnmp/rabbitmq/sbin/rabbitmqctl status #檢視狀態
/lnmp/rabbitmq/sbin/rabbitmqctl stop #停止服務

接下來來安裝php擴充套件AMQP,安裝了它以後,才能用PHP操作rabbitmq。

wget https://pecl.php.net/get/amqp-1.4.0.tgz
tar -zxvf amqp-1.4.0.tgz
cd amqp-1.4.0
/lnmp/php/bin/phpize
./configure --with-php-config=/lnmp/php/bin/php-config


安裝到這,就報了錯:
checking for amqp files in default path… not found
configure: error: Please reinstall the librabbit-mq distribution

在網上搜了搜,找到了解決方法(http://www.cnphp6.com/archives/68356):
需要安裝rabbitmq-c,rabbitmq-c是一個用於C語言的,與AMQP server進行互動的client庫。
下載地址:https://github.com/alanxz/rabbitmq-c

unzip rabbitmq-c-master.zip
cd rabbitmq-c-master
autoreconf -i
./configure --prefix=/lnmp/rabbitmq-c
make
make install

額,接著安裝PHP擴充套件AMQP

./configure --with-php-config=/lnmp/php/bin/php-config --with-amqp --with-librabbitmq-dir=/lnmp/rabbitmq-c
make && make install

草,又報錯啦:
/software/amqp-1.4.0/amqp_exchange.c:515: error: incompatible type for argument 7 of ‘amqp_exchange_declare’
/lnmp/rabbitmq-c//include/amqp_framing.h:798: note: expected ‘amqp_boolean_t’ but argument is of type ‘amqp_table_t’
/software/amqp-1.4.0/amqp_exchange.c:515: error: too few arguments to function ‘amqp_exchange_declare’
make: *** [amqp_exchange.lo] Error 1
在https://github.com/pdezwart/php-amqp/issues/127找到了方法:
應該是安裝的rabbitmq-c的版本太高了(安裝的是 v0.6.0),下載了v0.5.2版本(https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.2/rabbitmq-c-0.5.2.tar.gz),重新安裝rabbitmq-c,重新安裝php擴充套件AMQP,終於可以啦。真是一波三折啊。

在php配置檔案裡將擴充套件加上,重啟一下,看phpinfo,顯示如下圖即安裝成功。
php-amqp

用PHP寫個hello world的例子:
生產者:傳送訊息(建立連線–>建立channel–>建立交換機物件–>傳送資訊)

/**
生產者
*/
//配置資訊
$conn_args=array(
'host'=>'127.0.0.1',
'port'=>'5672',
'login'=>'guest',
'password'=>'guest',
'vhost'=>'/'
);

$e_name='e_yao';//交換機名
$k_route='key_1';//路由key

//建立連線和channel
$conn=new AMQPConnection($conn_args);
if(!$conn->connect()){
die("cannot connect to the broker!\n");
}
$channel=new AMQPChannel($conn);

//訊息內容
$message="Hello World!!";

//建立交換機物件
$ex=new AMQPExchange($channel);
$ex->setName($e_name);

//傳送訊息
for($i=0;$i<5;$i++){ echo "Send Message:".$ex->publish($message,$k_route)."\n";
}

$conn->disconnect();

消費者:接收訊息(建立連線–>建立channel–>建立交換機–>建立佇列–>繫結交換機/佇列/路由鍵–>接收訊息)

/*
*消費者
*/
//配置資訊
$conn_args=array(
'host'=>'127.0.0.1',
'port'=>'5672',
'login'=>'guest',
'password'=>'guest',
'vhost'=>'/'

);
$e_name='e_yao';//交換機名
$q_name='q_yao';//佇列名
$k_route='key_1';//路由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->declare()."\n";

//建立佇列
$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');
}
$conn->disconnect();

//處理訊息回撥函式

function processMessage($envelope,$queue){
$msg=$envelope->getBody();
echo $msg."\n";//處理訊息
$queue->ack($envelope->getDeliveryTag());
}

在一個終端執行消費者consumer.php:
consumer
另一終端執行生產者producer.php:
producer
消費者 接收到訊息:

關於php的呼叫amqp的更多資訊可以看參考連結。