用PHP Demo 学 RabbitMq

先安装rabbitmq的php扩展amqp,至于为何是amqp,稍微搜索一下就会了解rabbitmq是基于amqp协议的。

概要

我们先大致了解一下rabbitmq,简单的说就是一个生产者-消费者模式的消息队列,支持消息持久化。同时需要了解几个名词,以及这几个名词之间的联系

  1. 生产者(producer)
  2. 信道(channel)
  3. 消息交换机(exchange)
  4. 消息队列(queue)
  5. 消费者(consumer)
  6. 路由关键词
工作流程

生产者产生的消息通过信道投递到某个消息交换机上,投递过程中指定了一个路由关键字,消息交换机将这条消息投递到不同的消息队列中的时候,依据路由关键字,该消息可能会被投递到某一个或者某几个符合路由规则的消息队列中,消费者从消息队列中取出消息进行后一步处理。

分发机制

当多个消费者同时在消费同一个消息队列的时候,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 启动rabbitmq
  • rabbitmqctl stop_app 关闭rabbitmq
  • rabbitmqctl reset 重置rabbitmq队列
  • rabbitmqctl list_queues 查看rabbitmq中队列
  • rabbitmqctl list_exchanges 查看rabbitmq中的交换机
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值