先安装rabbitmq的php扩展amqp,至于为何是amqp,稍微搜索一下就会了解rabbitmq是基于amqp协议的。
概要
我们先大致了解一下rabbitmq,简单的说就是一个生产者-消费者模式的消息队列,支持消息持久化。同时需要了解几个名词,以及这几个名词之间的联系
- 生产者(producer)
- 信道(channel)
- 消息交换机(exchange)
- 消息队列(queue)
- 消费者(consumer)
- 路由关键词
工作流程
生产者产生的消息通过信道投递到某个消息交换机上,投递过程中指定了一个路由关键字,消息交换机将这条消息投递到不同的消息队列中的时候,依据路由关键字,该消息可能会被投递到某一个或者某几个符合路由规则的消息队列中,消费者从消息队列中取出消息进行后一步处理。
分发机制
当多个消费者同时在消费同一个消息队列的时候,rabbitmq会顺序分发队列中message,当每个message收到ack,就会将这条消息从消息队列中删除,这种分发的机制叫做round-robin
这里不过多讨论rabbitmq的消息分发机制,有兴趣可以参考这个衔接
RabbitMQ消息队列(三):任务分发机制
Demo
$conn_args = array(
'host'=>'127.0.0.1', //rabbitmq 服务器host
'port'=>5672, //rabbitmq 服务器端口
'login'=>'guest', //登录用户
'password'=>'guest', //登录密码
'vhost'=>'/' //虚拟主机
);
$e_name = 'e_demo';
$q_name = 'q_demo';
$k_route = 'key_1';
$conn = new AMQPConnection($conn_args);
if(!$conn->connect()){
die('Cannot connect to the broker');
}
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$status = $ex->declareExchange(); //声明一个新交换机,如果这个交换机已经存在了,就不需要再调用declareExchange()方法了.
$q = new AMQPQueue($channel);
$q->setName($q_name);
$status = $q->declareQueue(); //同理如果该队列已经存在不用再调用这个方法了。
$ex->publish($msg, $k_route);
以上代码就构造了一个生产者,并投递了一条消息到rabbitmq中。
$conn_args = array(
'host'=>'127.0.0.1',
'port'=>5672,
'login'=>'guest',
'password'=>'guest',
'vhost'=>'/'
);
$e_name = 'e_demo';
$q_name = 'q_demo';
$k_route = 'key_1';
$conn = new AMQPConnection($conn_args);
if(!$conn->connect()){
die('Cannot connect to the broker');
}
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$q = new AMQPQueue($channel);
var_dump($q);
$q->setName($q_name);
$q->bind($e_name, $k_route);
$arr = $q->get();
var_dump($arr);
$res = $q->ack($arr->getDeliveryTag());
$msg = $arr->getBody();
var_dump($msg);
以上代码构建了一个消费者,并从消息队列中拿出一条消息,并把该消息从队列中移除。
补充
补充说明一下rabbitmq的使用命令
rabbitmq-server start
是启动rabbitmq服务。
主要的管理rabbitmq使用的是rabbitctl命令
rabbitmqctl start_app
启动rabbitmqrabbitmqctl stop_app
关闭rabbitmqrabbitmqctl reset
重置rabbitmq队列rabbitmqctl list_queues
查看rabbitmq中队列rabbitmqctl list_exchanges
查看rabbitmq中的交换机