当前位置: 首页 > news >正文

php使用rabbitmq

这里使用的是 php-amqplib

 composer require php-amqplib/php-amqplib

生产端send.php

<?phprequire_once "./vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;//交换机名称
$exc_name = 'exchange.canal';
//路由键
$routing_key = 'canal-routing-key';
//队列名称
$queue_key = 'canal_queue';//生产者
//Connection: publisher/consumer和broker之间的TCP连接
//Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。
//Channel是在connection内部建立的逻辑连接Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。//1.建立connction
/*** 主要参数说明:* $host:  RabbitMQ服务器主机IP地址* $port:  RabbitMQ服务器端口* $user:  连接RabbitMQ服务器的用户名* $password:  连接RabbitMQ服务器的用户密码* $vhost:   连接RabbitMQ服务器的vhost(服务器可以有多个vhost,虚拟主机,类似nginx的vhost)*/
$connection = new AMQPStreamConnection('192.168.0.105', 5672, 'admin', 'admin', "/");
//2.建立通道Channel
$channel = $connection->channel();//3.声明交换器
/*** exchange_declare($exchange, $type, $passive = false, $durable = false, $auto_delete = true, $internal = false, $nowait = false, $arguments = array(), $ticket = null) 。* 试探性申请一个交换器,若该交换器不存在,则创建;若存在,则跳过。* 主要参数说明:* $exchange:队列名称* $type 交换器类型,常见类型如:fanout,dircet,topic,hraders四种* $passive 只判断不创建,一般是判断该交换机是否存在* $durable:是否开启持久化 设置true表示持久化,反之非持久化。持久化可以将交换器存盘,在服务器重启的适合不会丢失相关数据。* $auto_delete:是否自动删除* $internal:设置是否内置,设置true表示内置交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这个方式* $nowait:如果为true表示不等待服务器回执信息,函数将返回NULL,可提高访问速度。*/
$channel->exchange_declare($exc_name, 'direct', false, true, false);//4.声明队列
/*** queue_declare($queue, $passive = false, $durable = false, $exclusive = false, $auto_delete = true, $nowait = false, $arguments = null, $ticket = null)* 试探性申请一个队列,若该队列不存在,则创建;若存在,则跳过。* 主要参数说明:* $queue:队列名称* $passive 只判断不创建,一般是判断该队列是否存在* $durable:是否开启持久化 设置true表示持久化,反之非持久化。持久化可以将队列存盘,在服务器重启的适合不会* $exclusive:是否独占,设置true表示独占,只能有一个消费者监听该队列,false表示共享,可以有多个消费者监听该队列。*/
$channel->queue_declare($queue_key, false, true, false, false);//5.绑定队列到交换器
/*** queue_bind($queue, $exchange, $routing_key = '', $nowait = false, $arguments = null, $ticket = null)* 绑定队列到交换器* 主要参数说明:* $queue:队列名称* $exchange:交换器名称* $routing_key:路由键*/
$channel->queue_bind($queue_key, $exc_name, $routing_key);//4.创建消息
$content = 'this is ' . $routing_key . ' message';
/*** 主要参数说明:*  data:消息*  properties Array 设置的属性,比如设置该消息是否持久化* DELIVERY_MODE_NON_PERSISTENT 不持久化* DELIVERY_MODE_PERSISTENT 持久化*/
$msg = new AMQPMessage($content, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_NON_PERSISTENT]);//5.发布消息
/*** basic_publish主要参数说明:* $msg 消息内容* $exchange 交换器* $routing_key routing_key或者队列名称* $mandatory 匹配不到队列时,是否立即丢弃消息* $immediate 队列无消费者时,是否立即丢弃消息* $ticket 不清楚是什么作用*/
$channel->basic_publish($msg, $exc_name, $routing_key);
//7.通道关闭
$channel->close();
//8.连接关闭
$connection->close();

消费端receive.php

<?php
require_once "./vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection;//交换机名称
$exc_name  = 'exchange.canal';
//路由键
$routing_key = 'canal-routing-key';//1.建立connction
$connection = new AMQPStreamConnection('192.168.0.105', 5672, 'admin', 'admin', "/");
//2.建立通道Channel
$channel = $connection->channel();//3.声明交换器
$channel->exchange_declare($exc_name, 'direct', false, true, false);//4.获取系统生成的消息队列名称,这里也可以指定一个队列名称
list($queue_name, ,) = $channel->queue_declare('', false, true, true, false);//5.将队列名与交换器名进行绑定,并指定routing_key
$channel->queue_bind($queue_name,$exc_name,$routing_key);//6.设置消费成功后才能继续进行下一个消费
$channel->basic_qos(null, 1, null);//7.定义收到消息回调函数
$callback = function ($msg) {echo 'received = ', $msg->body . "\n";//确认消息已被消费,从生产队列中移除$msg->ack();
};//8.开启消费no_ack=false,设置为手动应答
$channel->basic_consume($queue_name, '', false, false, false, false, $callback);//9.不断的循环进行消费
while ($channel->is_open()) {$channel->wait();
}//关闭连接
$channel->close();
$connection->close();

参考文章

  • //https://blog.csdn.net/qq_28979487/article/details/136325509
http://www.lryc.cn/news/342742.html

相关文章:

  • 前端发起网络请求的几种常见方式(XMLHttpRequest、FetchApi、jQueryAjax、Axios)
  • 通过氧气退火增强β-Ga₂O₃二极管.中国科技大学和河北半导体研究所的研究人员在这一特定领域取得了最新重大进展
  • C语言猜数字游戏
  • 笔记本连接不上远程桌面,笔记本无法连接远程桌面的可能原因及解决方法
  • Android 音视频播放器 Demo(一)—— 视频解码与渲染
  • Flutter笔记:Widgets Easier组件库(3)使用按钮组件
  • 荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)
  • 智慧公厕建设,打造智慧城市基础设施新亮点
  • Kubernetes 教程:在 Containerd 容器中使用 GPU
  • LNMP部署wordpress
  • 本地部署大模型ollama+docker+open WebUI/Lobe Chat
  • qt学习篇---界面按键关联(信号和槽)
  • python Django 的内置权限系统或自定义模型来存储更复杂的角色和权限关系
  • 不上班,我靠这5份赚钱副业养活了自己
  • 强一致性的皇冠:分布式事务模型的至高法则揭秘
  • mac/windows下安装docker,minikube
  • 【爬虫】fake_useragent的使用、BeautifulSoup(find()和find_all())
  • ComfyUI中图像亮度/对比度/饱和度处理
  • 基于FPGA的DDS波形发生器VHDL代码Quartus仿真
  • C++语法|可调用对象与function类型
  • Linux学习之路 -- 文件 -- 文件描述符
  • JDK动态代理和Cglib动态代理区别
  • 牛客 | 字符金字塔
  • 【计算机科学速成课】笔记三——操作系统
  • 用js代码实现贪吃蛇小游戏
  • 微信小程序+esp8266温湿度读取
  • 软考中级-软件设计师(十)网络与信息安全基础知识
  • 推荐一个好用的命令行工具ShellGPT
  • Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇
  • uniapp + uView动态表单校验