您的位置:首页 > 其它

初步对消息队列RabbitMQ的了解

2016-04-11 19:08 477 查看
https://www.bhqb.org/tag/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,结果如图,表示安装成功



接下来安装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写个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:



另一终端运行生产者producer.php:



消费者 接收到消息:



关于php的调用amqp的更多信息可以看参考链接。

参考:
用PHP尝试RabbitMQ(amqp扩展)
RabbitMQ与PHP(一)
RabbitMQ官方中文入门教程(PHP版)
第一部分:Hello World
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: