美文网首页php
rabbitmq的基本使用(php)

rabbitmq的基本使用(php)

作者: ysp123 | 来源:发表于2019-03-04 18:52 被阅读0次

在使用rabbimq之前先理解rabbitmq的基本通信方式:

发布过程:
connection(mq链接) -> channel(创建channel) -> exchange(创建exchange路由) -> queue(创建队列) -> bind(绑定exchangeName 和 routekey) -> publish(exchange发布消息) -> disconnect(关闭链接)

订阅过程:
connection(mq链接) -> channel(创建channel) -> exchange(创建exchange路由) -> queue(创建队列) -> bind(绑定exchangeName 和 routekey) -> consume(回调函数消费消息) -> disconnect(关闭链接)

发布(publish.php)

$exchangeName = "testex";
$queueName = "testqueue";
$routeKey = "testkey";

$message = "hello rabbitmq message!";

$connection  = new AMQPConnection(['host'=>'127.0.0.1','port'=>'5672','vhost'=>'/','login'=>'ysp','password'=>'123123']);
$connection->connect() or die('can not connect broker server !');

$channel = new AMQPChannel($connection);
//$channel->setPerfetchCount(1);

$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();

$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();

$queue->bind($exchangeName, $routeKey);

$exchange->publish($message, $routeKey);

$connection->disconnect();

订阅(subscribe.php)

$exchangeName = 'testex';
$queueName="queuetest";
$routeKey = 'testkey';

$connection = new AMQPConnection(['host'=>'127.0.0.1','port'=>'5672','vhost'=>'/','login'=>'ysp','password'=>'123123']);
$connection->connect() or die('can not connect broker server !');

$channel = new AMQPChannel($connection);
//$channel->setPerfetchCount(1);

$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();

$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();

$queue->bind($exchangeName, $routeKey);

echo "message ........";
while(true){
        $queue->consume('dealMsg');
}

$connection->disconnect();

function dealMsg($event, $q){
        $msg = $event->getBody();
        echo $msg."\r\n";
        $q->ack($event->getDeliveryTag());
}

rabbitmq消息机制:
消息确认:为了保证数据不被丢失,RabbitMQ 支持消息确认机制,这种机制下不能采用 no-ack,而应该是在处理完数据后发送 ack。如果处理中途 Consumer 退出了,但是没有发送 ack,那么 RabbitMQ 就会把这个 Message 发送到下一个 Consumer,这样就保证了在 Consumer 异常退出的情况下数据也不会丢失。
代码中使用了 queue->ack(event->getDeliveryTag());,这就是消息确认机制的应用,这种情况下,即使中断任务执行,也不会影响 RabbitMQ 中消息的处理,RabbitMQ 会将其发送给下一个 Consumer 进行处理。
消息持久化:
为了保证在 RabbitMQ 退出或者 crash 了数据不丢失,需要将 Queue 和 Message 持久化。

exchange持久化
$exchange->setFlags(AMQP_DURABLE);

queue持久化
$queue->setFlags(AMQP_DURABLE);

公平分发:
如果Consumer数量很多或者希望每个Consumer同时只处理一个任务可以通过在Consumer中设置PrefetchCount来实现更加均匀的任务分发。
告诉 RabbitMQ,在同一时刻,不要发送超过 1 条消息给一个工作者(worker),直到它已经处理了上一条消息并且作出了响应。这样,RabbitMQ 就会把消息分发给下一个空闲的工作者(worker)。

$channel = new AMQPChannel($connection);
$channel->setPerfetchCount(1);

exchange将消息加入队列有四种方式:direct、topic 和 fanout。anout 就是广播模式,会将 Message 都放到它所知道的所有 Queue 中。

$exchange->setType(AMQP_EX_TYPE_DIRECT);  或  $exchange->setType(AMQP_EX_TYPE_TOPIC);  或   $exchange->setType(AMQP_EX_TYPE_FANOUT);

rabbitmq封装github地址: https://github.com/yspwf/rabbimq
参考: https://blog.csdn.net/super_rd/article/category/6869439

相关文章

  • 笔试面试

    轻松搞定 rabbitMQ rabbitMQ 的基本使用。PHP 程序员的技术成长规划 按照了解的很多 PHP/L...

  • rabbitmq的基本使用(php)

    在使用rabbimq之前先理解rabbitmq的基本通信方式: 发布过程:connection(mq链接) -> ...

  • Mac PHP RabbitMQ 环境部署

    系统环境 安装RabbitMQ 安装PHP RabbitMQ驱动 PHP 使用 AMQP 协议( “Advance...

  • rabbit 消息推送

    1.首先需要安装PHP使用的RabbitMQ 包:php-amqplib composer require php...

  • docker安装RabbitMQ

    摘要 本文主要介绍了使用docker安装rabbitmq消息队列服务,并简述了使用php操作rabbitmq的必要...

  • MAMP5.3安装rabbitmq扩展

    PHP 使用 AMQP 协议来连接 Rabbitmq,使 PHP 支持 AMQP 协议,需要安装: rabbitm...

  • php-rabbitMQ拓展安装

    一、PHP-rabbitMQ拓展安装 1.php-rabbitMQ拓展下载php-rabbitMQ拓展源码通过ph...

  • php and python 初探 rabbitmq

    本章使用 docker 部署 rabbitmq, 并且使用php 以及python 进行连接和通讯 使用docke...

  • php7.1 安装amqp扩展

    php7.1 安装amqp扩展 在php开发中使用rabbitmq消息队列时,需要安装PHP扩展amqp,安装步骤...

  • PHP使用RabbitMQ

    新建dockerfile文件,内容如下。安装amqp扩展需要librabbitmq依赖,所以需要先安装librab...

网友评论

    本文标题:rabbitmq的基本使用(php)

    本文链接:https://www.haomeiwen.com/subject/taziuqtx.html