PHP + Laravel + RabbitMQ + Redis 实现消息队列 (二) 消费队列在RabbitMQ和redis中的简单使用

news2024/11/14 17:10:27

最简单的队列功能

RabbitMQ和消息传递通常会使用一些术语:

  • 生产者(Producer)意味着发送消息。一个发送消息的程序称为生产者。
  • 队列(Queue)尽管消息通过RabbitMQ和您的应用程序流动,但它们只能存储在队列中。队列仅受主机内存和磁盘限制,它本质上是一个大的消息缓冲区。
  • 消费者(Consumer)与接收类似。消费者是一个主要等待接收消息的程序。
    图来自于RabbitMQ官网
    如上图 来自于RabbitMQ官网 其中 hello 这一个区块就是 Queue 也可以称为 Q

需要注意的是:

  • 多个生产者可以发送消息到一个队列,多个消费者可以尝试从一个队列接收数据。
  • 生产者、消费者和代理不必驻留在同一主机上。
  • 一个应用程序也可以既是生产者又是消费者。

RebbitMQ 实现

  1. 首先 5672 是 RabbitMQ 的服务端口,15672 则是它自带的一个管理工具的访问端口(也就是上一篇文章我们开启的web管理端);
  2. 其次我们需要安装PHP 的 Composer 组件, composer require php-amqplib/php-amqplib安装的时候尽量版本选择 3.2 以上版本,最开始我安装的是2.8 会缺失一些函数和官网Demo对不上;用于操作 RabbitMQ 消息队列,同时需要开启 sockets 扩展。这里需要去对应的php.ini 中找到 sockets并且打开它,然后重载配置或者重启你的服务;
    在这里插入图片描述

P端添加数据 ( send )

在这里插入图片描述

 		 // 建立连接
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel(); // 获取频道

        // 定义队列
        $channel->queue_declare('hello', false, false, false, false);

        // 创建消息
        $msg = new AMQPMessage('Hello World!');
        $channel->basic_publish($msg, '', 'hello'); // 将消息放入队列中

        echo "生产者向消息队列中发送信息:Hello World!";

        $channel->close();
        $connection->close();

在上面这段代码中 我们需要注意的是

  • channel 它是共享单个 TCP 连接的轻量级信道 这样的好处是不用开辟多个TCP 连接减少多个连接带来的资源损失;管理简便,这种粒度的控制允许您根据需要调整每个通道的最大消息数量、优先级、确认模式等,以及整个连接的最大资源使用情况,从而更好地优化和保护系统的稳定性和可用性。
  • AMQPMessage RabbitMQ 中是用来封装和传递消息内容及相关信息的对象;

消费/接受消息(Receiving)

在这里插入图片描述

    // 建立连接
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel(); // 获取频道

        // 定义队列
        $channel->queue_declare('hello', false, false, false, false);

        echo "等待消息,或者使用 Ctrl+C 退出程序。", PHP_EOL;

        // 定义接收数据的回调函数
        $callback = function ($msg) {
            echo '接收到数据: ', $msg->body, PHP_EOL;
        };
        // 消费队列,获取到数据将调用 callback 回调函数
        $channel->basic_consume('hello', '', false, true, false, false, $callback);
        // 处理接收消息
        while ($channel->is_open()) {
            $channel->wait();
        }

        // 关闭频道和连接
        $channel->close();
        $connection->close();

我们进行一个测试,可以看到消费者先是输出了接收到的数据,然后正常的打印出来了;
在这里插入图片描述
这里我们的测试环境使用的是larveal;其中P端代码我放到了,作为一个基础的路由进行访问,但是在因为这里消费的代码不能这样处理所以消费端的代码我使用了 larveal 提供的命令行

在这里插入图片描述

在这里插入图片描述

Redis 实现

send

    public function redisSend(){
       $time = time();
       echo "生产者向消息队列中发送信息:Hello World!".$time;
       Redis::lpush('hello', 'Hello World!'.$time);
    }

Receiving

class RedisReceivingCommand extends Command
{
    protected $signature = 'redis:receiving';

    protected $description = '消费队列';

    public function handle()
    {
        echo "等待消息,或者使用 Ctrl+C 退出程序。", PHP_EOL;

        while(1){
            $data = Redis::rpop('hello');
            if ($data){
                echo '接收到数据: ', $data, PHP_EOL;
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(01):数据结构概述(基本术语、逻辑结构和物理结构)

1、数据结构概述 (1)基本术语 A.数据元素 具有一定意义的基本单位。如人类的数据元素是人(张三、李四等)。 B.数据项 可以看作是数据元素的属性。如人的属性(姓名、年龄、身高等) C.数据对象 性质相同的数据元素的集合。如某一栋…

群聊的创建 表情包发送 图片发送

目录 群聊: ​编辑 表情包发送: 图片发送: 群聊: 1.群资料的表groupinformation 字段:GroupId 群id,GroupName 群名,CreatTime 创群时间,CreatUserId 创群的人,…

萤石云 ezuikit-js创建的播放器实例esc取消全屏后变黑屏

原因:上层页面重新设置了容器的宽高,导致uikit退出全屏时宽高计算异常 解决方法:实例初始化的时候会传入宽高width、height,播放器的画面尺寸是根据这两个参数设置的,然后退出全屏会回到这两个值

计算机的错误计算(五十五)

摘要 展示大数的余弦函数值的错误计算。 根据国际IEEE 754 标准[1],包括余弦在内的三角函数的定义域是整个实数范围: 但是,实际情况怎样呢? 例1. 计算 . 在 Python下计算: x30**65 print(x) import math print(ma…

只强的Java学习之路8-7

一. 安装配置nodejs npm create vitelatest npm install vue-router npm install axios npm install element-plus --save npm run dev https://element-plus.org/zh-CN/#/zh-CN 新建项目&#xff1a; easy.vue <script setup></script><!--绑定数据-->…

在vue中页面使用了动态组件组件导致首次页面加载时子组件样式不显示,刷新后才正常

问题&#xff1a; 在vue中页面使用了动态组件组件导致首次页面加载时子组件样式不显示&#xff0c;刷新后才正常。 原因&#xff1a; 因为动态组件的延迟加载&#xff0c;如果使用了Vue的动态组件&#xff08;如<component :is"...">&#xff09;&#xff0c;…

【代码随想录】有序数组的平方

本博文为《代码随想录》的学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&…

6种常用的AR跟踪方法

增强现实 (AR) 是一项令人着迷的技术&#xff0c;可将虚拟内容与现实世界无缝集成。实现这种无缝集成的关键组件之一是跟踪。各种类型的跟踪用于确定 AR 内容在环境中的准确位置和方向。本文介绍 AR 最常见的6种跟踪方法。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - Y…

ctfshow-web入门-sql注入(web191-web195)

目录 1、web191 2、web192 3、web193 4、web194 5、web195 1、web191 过滤了 ascii 使用 ord 代替&#xff1a; import requests import string url "http://a585c278-320a-40e7-841f-109b1e394caa.challenge.ctf.show/api/index.php" out for j in range(1…

哈佛大学单细胞课程|笔记汇总 (五)

哈佛大学单细胞课程|笔记汇总 &#xff08;四&#xff09; &#xff08;五&#xff09;Count Normalization and Principal Component Analysis 获得高质量的单细胞后&#xff0c;单细胞RNA-seq&#xff08;scRNA-seq&#xff09;分析工作流程的下一步就是执行聚类。聚类的目…

代理IP如何助力社交媒体数据挖掘

目录 引言 一、 社交媒体数据挖掘的挑战 1、访问限制 2、反爬虫技术 3、数据隐私和合规性 4、数据的多样性和复杂性 5、技术门槛 二、解决方案:代理IP 1、绕过IP封锁 2、管理访问频率 3、保护用户隐私 4、提高数据获取的成功率 三、代理IP平台:站大爷 1、高效性…

商标担保注册出现的常见问题!

最近有个网友联系到普推知产商标老杨&#xff0c;问一个商标名称注册担保事项&#xff0c;检索信息给详细分析下&#xff0c;这个商标名称他以前申请注册过&#xff0c;也做过驳回复审&#xff0c;还是不予注册。 如果相同的名称现在去申请注册&#xff0c;当然会直接驳回&…

模型太大加载不畅?不兼容?3D模型轻量化帮您瘦身减负

在当今的数字时代&#xff0c;3D模型已成为游戏开发、建筑设计、虚拟现实及增强现实等多个行业不可或缺的基石。它们不仅为这些领域带来了前所未有的视觉盛宴和沉浸式体验&#xff0c;还极大地推动了行业的创新与发展。然而&#xff0c;随着模型设计日益复杂&#xff0c;其文件…

Mysql执行计划(下)

1、执行计划概念 执行计划是什么&#xff1a;使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。 作用&#xff1a;分析你的查询语句或是表结构的性能瓶颈 语法&#xff1a;Explain SQL语句 执行计划输出内容介绍&#xf…

华为毕昇打印机:智能生态引领打印机市场新变革

在全球打印机市场中&#xff0c;华为作为通信和消费电子领域的领军企业&#xff0c;其新品打印机的发布无疑为行业带来了新的活力。华为毕昇打印机的推出&#xff0c;预示着华为将以其独特的智能生态理念&#xff0c;重塑打印机行业的格局。 首先&#xff0c;华为毕昇打印机的…

【书生大模型实战营第三期 | 基础岛第3关-浦语提示词工程实践】

学习心得&#xff1a;浦语提示词工程实践 摘要 本文是对《浦语提示词工程实践》课程的学习心得&#xff0c;旨在总结课程的核心内容&#xff0c;包括环境配置、模型部署、提示工程的基本原则和LangGPT结构化提示词的使用方法。通过学习&#xff0c;我深刻理解了在人工智能领域…

Linux系统之ncdu命令的基本使用

Linux系统之ncdu命令的基本使用 一、ncdu命令命令介绍1.1 ncdu简介1.2 ncdu特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表 四、安装ncdu工具4.1 安装ncdu软件4.2 n…

Stable Diffusion 使用详解(7)---AI 摄影

目录 背景 底模的选择 例子 majicMix GirlFriendMix&#xff08; Lora&#xff09; 对比效果 LEOSAMs MoonFilm ADetailer 使用 说明 例子 问题 处理方式 效果 背景 魔法师使用魔法作的画有时候太过完美&#xff0c;以至于有点脱离真实摄影的感觉&#xff0c;我们…

SQL注入之oracle,mongodDB注入

简要学习各种数据库的注入特点 access与其他数据库的区别 1.access网站的数据在网站目录下&#xff0c;以mdb形式存储。每个网站之间的数据库相互独立。这在一定程度上避免了跨库注入&#xff01; 2.access功能比较少&#xff0c;比如没有文件读写&#xff0c;没有记录信息表i…

优化版轻量级自适应商城卡密发卡平台源码 全开源、商业友好 重塑高效发卡体验

引领数字商品交易新风尚&#xff0c;我们自豪地推出这款精心优化后的轻量级自适应商城卡密发卡平台源码。这款源码不仅继承了原版的精髓&#xff0c;更通过深度二次开发&#xff0c;彻底修复了原有bug&#xff0c;并剔除了所有冗余文件与代码&#xff0c;确保系统运行更加流畅&…