初步对消息队列RabbitMQ的了解

来源:互联网 发布:android手机投影到mac 编辑:程序博客网 时间:2024/05/22 12:20

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,结果如图,表示安装成功
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的更多信息可以看参考链接。

参考:
用PHP尝试RabbitMQ(amqp扩展)
RabbitMQ与PHP(一)
RabbitMQ官方中文入门教程(PHP版) 第一部分:Hello World



0 0
原创粉丝点击