rabbitMQ 学习笔记(php)

安装

docker

docker run -id --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=kaifapassword -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

模式

Simplest

Producer

// Producer
//创建rabbit连接
$connection = new AMQPStreamConnection($host, $port = 5672, $user, $password);
// 通过连接获取通道
$channel = $connection->channel();
$queue_name = 'hello';
// 通过通道声明队列 声明队列是幂等的-仅当队列不存在时才创建
// 第一个参数 queue 队列名称
// 第二个参数 passive 检查是否存在同名队列
// 第三个参数 durable 是否持久化 所谓的消息是否存盘
// 第四个参数 exclusive 是否有排他性  是否是一个独占队列
// 第五个参数 auto_delete 是否自动删除 随着最后一个消费者消息消费完毕后 是否把队列自动删除
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,可以提高访问速度。
// 第七个参数 arguments 携带附属参数,消费者可以获取
$channel->queue_declare($queue_name, false, false, false, false);
// 准备发送消息
$msg = new AMQPMessage('Hello World!');
// 发送消息给队列
// 第一个参数 msg 要发送的消息
// 第二个参数 exchange 交换器的名称,指明消息需要发送到哪个交换器中。如果设置为空字符串,则消息会被发送到RabbitMQ默认的交换器中。
// 第三个参数 routing_key 队列名称
// 第四个参数 mandatory 设置为true时,交换器无法根据自身的类型和路由键找到一个符合条件额队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者。当设置为false的时,出现上述问题,则消息直接被丢弃。
// 第五个参数 immediate RabbitMQ3.0版本开始去掉对immediate参数的支持。
$channel->basic_publish($msg, '', $queue_name);
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();

Consumer

//创建rabbit连接
$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
// 通过连接获取通道
$channel = $connection->channel();
$queue_name = 'hello';
// 通过通道声明队列 声明队列是幂等的-仅当队列不存在时才创建
// 第一个参数 queue 队列名称
// 第二个参数 passive 检查是否存在同名队列
// 第三个参数 durable 是否持久化 所谓的消息是否存盘
// 第四个参数 exclusive 是否有排他性  是否是一个独占队列
// 第五个参数 auto_delete 是否自动删除 随着最后一个消费者消息消费完毕后 是否把队列自动删除
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,可以提高访问速度。
// 第七个参数 arguments 携带附属参数,消费者可以获取
$channel->queue_declare($queue_name, false, false, false, false);

echo " [*] Waiting for messages. To exit press CTRL+C\n";
$callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "\n";
};
//消费消息
// 第一个参数 queue 队列名称
// 第二个参数 consumer_tag 消费者标签。用来区分多个消费者
// 第三个参数 no_local AMQP的标准,但rabbitMQ并没有做实现
// 第四个参数 no_ack 收到消息后,是否不需要回复确认即被认为被消费;设置为true,表示自动应答;设置为false表示手动应答
// 第五个参数 exclusive 设置是否排他。排他消费者,即这个队列只能由一个消费者消费.适用于任务不允许进行并发处理的情况
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,但若排他开启的话,则必须需要等待结果的,如果两个一起开就会报错
// 第七个参数 callback callback函数
// 第八个参数 ticket
// 第九个参数 arguments 一些额外配置
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);

//$channel->is_open() 如果生产者生产了消息 就会执行
while ($channel->is_open()) {
	//这里会执行回调函数 basic_consume方法的 $callback方法
    $channel->wait();
}
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();

Work-轮询

轮询使用方法,先新建两个命令窗口运行Consumer文件进行监听消费消息,然后再新建命令窗口运行Producer文件进行生产消息。这时候会发现运行Consumer的两个命令窗口会消费相同数量的消息。测试的时候注意:运行后,CTRL+C退出,连接通道还在,这是再运行两个Consumer,你会发现从3、4开始,因为之前CTRL+C退出的两个也算在内,可以自行去web界面的rabbitmq查看连接通道,重启rabbitmq好了

Producer

//创建rabbit连接
$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
// 通过连接获取通道
$channel = $connection->channel();
$queue_name = 'test_work';
// 通过通道声明队列 声明队列是幂等的-仅当队列不存在时才创建
// 第一个参数 queue 队列名称
// 第二个参数 passive 检查是否存在同名队列
// 第三个参数 durable 是否持久化 所谓的消息是否存盘
// 第四个参数 exclusive 是否有排他性  是否是一个独占队列
// 第五个参数 auto_delete 是否自动删除 随着最后一个消费者消息消费完毕后 是否把队列自动删除
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,可以提高访问速度。
// 第七个参数 arguments 携带附属参数,消费者可以获取
$channel->queue_declare($queue_name, false, false, false, false);
$dot = '';
for ($i = 1; $i <= 20; $i++){
    $dot .= '.';
    $data = '生产的第' . $i . '条消息' . $dot;
    // 准备发送消息
    $msg = new AMQPMessage($data);
    // 发送消息给队列
	// 第一个参数 msg 要发送的消息
	// 第二个参数 exchange 交换器的名称,指明消息需要发送到哪个交换器中。如果设置为空字符串,则消息会被发送到RabbitMQ默认的交换器中。
	// 第三个参数 routing_key 队列名称
	// 第四个参数 mandatory 设置为true时,交换器无法根据自身的类型和路由键找到一个符合条件额队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者。当设置为false的时,出现上述问题,则消息直接被丢弃。
	// 第五个参数 immediate RabbitMQ3.0版本开始去掉对immediate参数的支持。
    $channel->basic_publish($msg, '', $queue_name);
    echo ' [x] 发送 ', $data, "\n";
}
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();

Consumer

//创建rabbit连接
$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
// 通过连接获取通道
$channel = $connection->channel();
$queue_name = 'test_work';
// 通过通道声明队列 声明队列是幂等的-仅当队列不存在时才创建
// 第一个参数 queue 队列名称
// 第二个参数 passive 检查是否存在同名队列
// 第三个参数 durable 是否持久化 所谓的消息是否存盘
// 第四个参数 exclusive 是否有排他性  是否是一个独占队列
// 第五个参数 auto_delete 是否自动删除 随着最后一个消费者消息消费完毕后 是否把队列自动删除
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,可以提高访问速度。
// 第七个参数 arguments 携带附属参数,消费者可以获取
$channel->queue_declare($queue_name, false, false, false, false);

$callback = function ($msg) {
    echo ' [x] 收到 ', $msg->body, "\n";
    sleep(substr_count($msg->body, '.'));
    echo " [x] Done\n";
};
//消费消息
// 第一个参数 queue 队列名称
// 第二个参数 consumer_tag 消费者标签。用来区分多个消费者
// 第三个参数 no_local AMQP的标准,但rabbitMQ并没有做实现
// 第四个参数 no_ack 收到消息后,是否不需要回复确认即被认为被消费;设置为true,表示自动应答;设置为false表示手动应答
// 第五个参数 exclusive 设置是否排他。排他消费者,即这个队列只能由一个消费者消费.适用于任务不允许进行并发处理的情况
// 第六个参数 nowait 如果为true则表示不等待服务器回执信息.函数将返回NULL,但若排他开启的话,则必须需要等待结果的,如果两个一起开就会报错
// 第七个参数 callback callback函数
// 第八个参数 ticket
// 第九个参数 arguments 一些额外配置
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);

//$channel->is_open() 如果生产者生产了消息 就会执行
while ($channel->is_open()) {
     //这里会执行回调函数 basic_consume方法的 $callback方法
    $channel->wait();
}
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值