返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP消息队列实现及运用的方法是什么
  • 849
分享到

PHP消息队列实现及运用的方法是什么

2023-07-04 11:07:26 849人浏览 独家记忆
摘要

这篇文章主要讲解了“PHP消息队列实现及运用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php消息队列实现及运用的方法是什么”吧!消息队列的概念、原理、实现方式概念队列结构的一

这篇文章主要讲解了“PHP消息队列实现及运用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php消息队列实现及运用的方法是什么”吧!

消息队列的概念、原理、实现方式

概念
  • 队列结构的一个中间件

  • 不需要立即消费消息

  • 由消费者或者订阅者进行按顺序消费

基本的流程图如下所示
  • 流程
    PHP消息队列实现及运用的方法是什么

应用场景
  • 冗余

  • 解耦

  • 流量削峰

  • 异步通信

实现方式
  • mysql:可靠、速度慢

  • redis:速度快,对于大消息包处理较慢

  • 消息系统:可靠、专业性强

消息的触发机制
  • 死循环的方式,故障时无法及时恢复

  • 定时任务:压力均分、但是处理量有上限

  • 守护进程的方式

解耦 (订单和配送系统)
  • 架构设计1 采用定时任务的方式
    PHP消息队列实现及运用的方法是什么

    php入门到就业线上直播课:进入学习
    apipost = Postman + swagger + Mock + jmeter 超好用的API调试工具:点击使用

  • 使用配送处理系统进行处理时,将当前数据库里需要处理的订单状态更新为2,待处理完成后将状态设为1

  • 可以每次指定更新多少条数据

流量削锋 (Redis实现秒杀)
  • 使用队列的数据结构

    • lpush/rpush 将数据放入列表中

    • lpop/rpop 将数据移除列表并获取到移除的值

    • ltrim 保留指定区间内的元素

    • llen 获取列表长度

    • lset 通过索引设置列表的值

    • lindex 通过索引获取列表中的值

    • lrange 获取指定范围的元素

  • 图示如下
    PHP消息队列实现及运用的方法是什么

  • 代码流程如下

    • 秒杀程序将请求写入redis(uid,time)

    • 检查redis列表存放的长度,超过10个直接舍弃

    • 通过死循环读取redis数据,并存入数据库

      // Spike.php 秒杀程序if(Redis::llen('lottery') < 10){
         // 成功
         Redis::lpush('lottery', $uid.'%'.microtime());}else{
         // 失败}
    • // Warehousing.php 入库程序while(true){
          $user = Redis::rpop('lottery');
          if (!$user || $user == 'nil') {
              sleep(2);
              continue;
          }
          $user_arr = explode($user, '%');
          $insert_user = [
              'uid' => $user_arr[0],
              'time' => $user_arr[1]
          ];
          $res = DB::table('lottery_queue')->insert($insert_user);
          if (!$res) {
              Redis::lpush('lottery', $user);
          }}
  • 上述代码中假如并发过大的话会存在超卖的情况,此时可以使用文件或者redis分布式锁进行控制,先将商品放入redis list中 使用rpop进行取出,如果取不到则说明已经卖完

  • 具体的思路及伪代码如下

      // 先将商品放入redis中
     $Goods_id = 2;

     $sql = select id,num from goods where id = $goods_id;
     $res = DB::select($sql);
     if (!empty($res)) {
         // 也可以指定多少件
         Redis::del('lottery_goods' . $goods_id);
         for($i=0;$i<$res['num'];$i++){
             Redis::lpush('lottery_goods . $goods_id', $i);
         }
         LOG::info('商品存入队列成功,数量:' . Redis::llen('lottery_goods . $goods_id'));
     } else {
         LOG::info($goods_id . '加入失败');
     }
  •   // 开始秒杀
      $count = Redis::rpop('lottery_goods' . $goods_id);
      if (!$count) {
          // 商品已抢完
          ...
      }

      // 用户抢购队列
      $user_list = 'user_goods_id_' . $goods_id;
      $user_status = Redis::sismember($user_list, $user_id);
      if ($user_status) {
          // 已抢过
          ...
      }

      // 将抢到的放到列表中
      Redis::sadd($user_list, $uid);
      $msg = '用户:' . $uid . '顺序' . $count;
      Log::info($msg);
      // 生成订单等
      ...
      // 减库存
      $sql = update goods set num = num -1 where id = $goods_id and num > 0; // 防止超卖
      DB::update($sql)
      // 抢购成功
RabbitMQ
  • 架构及原理
    PHP消息队列实现及运用的方法是什么
    其中P代表生产者,X为交换机(channal),C代表消费者

  • 简单使用

      // Send.php
     require_once __DIR__.'/vendor/autoload.php';

     use PhpAMQpLib\Connection\AMQPStreamConnection;
     use PhpAmqpLib\Message\AMQPMessage;

     $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

     // 创建通道
     $channel = $connection->channel();
     // 声明一个队列
     $channel->queue_declare('user_email', false, false, false, false);
     // 制作消息
     $msg = new AMQPMessage('send email');
     // 将消息推送到队列
     $channel->basic_publish($msg, '', 'user_email');

     echo '[x] send email';

     $channel->close();
     $connection->close();
  •   // Receive.php
      require_once __DIR__.'/vendor/autoload.php';

      use PhpAmqpLib\Connection\AMQPStreamConnection;
      use PhpAmqpLib\Message\AMQPMessage;

      $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

      //创建通道
      $channel = $connection->channel();

      $channel->queue_declare('user_email', false, false, false, false);

      // 当收到消息时的回调函数
      $callback = function($msg){
          //发送邮件
          echo 'Received '.$msg->body.'\n';
      };

      $channel->basic_consume('user_email', '', false, true, false, false, $callback);

      // 保持监听状态
      while($channel->is_open()){
          $channel->wait();
      }

感谢各位的阅读,以上就是“PHP消息队列实现及运用的方法是什么”的内容了,经过本文的学习后,相信大家对PHP消息队列实现及运用的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: PHP消息队列实现及运用的方法是什么

本文链接: https://lsjlt.com/news/344718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP消息队列实现及运用的方法是什么
    这篇文章主要讲解了“PHP消息队列实现及运用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP消息队列实现及运用的方法是什么”吧!消息队列的概念、原理、实现方式概念队列结构的一...
    99+
    2023-07-04
  • Redis消息队列实现的方法是什么
    Redis消息队列通常通过使用Redis的List数据结构来实现。消息生产者可以将消息推送到List中,而消息消费者可以从List中...
    99+
    2024-04-22
    Redis
  • redis实现消息队列的方法
    这期内容当中的小编将会给大家带来有关redis实现消息队列的方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。消息队列,Message Queue,常用于解决并发系统中的资源一致性问题...
    99+
    2024-04-02
  • PHP怎么实现RabbitMQ消息列队
    这篇“PHP怎么实现RabbitMQ消息列队”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现RabbitMQ消息...
    99+
    2023-06-30
  • SpringBoot整合消息队列RabbitMQ的方法是什么
    本篇内容介绍了“SpringBoot整合消息队列RabbitMQ的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介在Spring...
    99+
    2023-07-05
  • 使用PHP实现消息队列的开发
    随着现代互联网应用对高并发、高吞吐量和高可靠性的要求越来越高,消息队列作为一种异步解耦系统架构方式越来越被应用在互联网领域的各个方面。其原理是先将消息发送到消息队列中,等待异步消费,从而达到解耦的目的,提高系统的可扩展性与可维护性。在目前市...
    99+
    2023-05-25
    PHP 消息队列 开发
  • 消息队列的特点是什么
    本篇内容主要讲解“消息队列的特点是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“消息队列的特点是什么”吧!什么是消息队列?消息队列( Message Queue )是一种...
    99+
    2023-06-04
  • PHP实现异步延迟消息队列的方法详解
    目录一、前言二、场景三、安装RabbitMQ延迟队列插件四、在Laravel框架中进行使用五、执行生产消息和消费消息一、前言 需求:电商秒杀场景中,如果用户下单10分钟未支付,需要进...
    99+
    2024-04-02
  • Python中线程的MQ消息队列实现以及消息队列的优点解析
    “消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成...
    99+
    2022-06-04
    队列 消息 线程
  • 队列在PHP与MySQL中的消息过滤和消息路由的实现方法
    随着互联网的快速发展,消息队列(Message Queue)作为一种重要的通信机制,在Web开发中扮演着至关重要的角色。消息队列可以用于实现解耦、削峰填谷、异步处理等功能。本文将介绍在PHP与MySQL中如何实现消息过滤和消息路由,并提供具...
    99+
    2023-10-21
    队列 (Queue) 消息过滤 (Message Filtering) 消息路由 (Message Routing)
  • Java中消息队列的作用是什么
    这篇文章主要讲解了“Java中消息队列的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中消息队列的作用是什么”吧!  这些接口之间耦合比较严重,每新增一个下游功能...
    99+
    2023-06-16
  • WCF消息队列的解决方案是什么
    WCF消息队列的解决方案是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。消息就是信息的来源,在WCF中消息队列分为公共队列、专用队列、管理队列、响应队列四种,下面我们就简单...
    99+
    2023-06-17
  • MQ消息队列的概念是什么
    这篇文章主要介绍“MQ消息队列的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MQ消息队列的概念是什么”文章能帮助大家解决问题。 一、消息队列使用场景 ...
    99+
    2024-04-02
  • 队列的消息保障和消息持久化在PHP与MySQL中的实现方法
    【引言】在互联网时代,随着用户量的增长和系统复杂性的增加,消息队列成为了重要的组件之一。消息队列可以实现解耦、异步处理、削峰填谷等功能,提高系统的稳定性和可扩展性。在实际应用中,我们常常需要考虑消息的可靠性和持久化存储。本文将介绍如何在PH...
    99+
    2023-10-21
    队列 消息持久化 消息保障
  • php消息队列怎么实现秒杀活动
    实现秒杀活动的关键是处理高并发请求,确保商品库存不被超卖。可以利用消息队列来实现秒杀活动,以下是一种简单的实现方式: 创建一个商品...
    99+
    2024-04-02
  • java消息队列应用场景是什么
    这篇文章主要讲解了“java消息队列应用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java消息队列应用场景是什么”吧!一、什么是队列队列(Queue)是一种常见的数据结构,其最...
    99+
    2023-06-29
  • PHP实现RabbitMQ消息列队的示例代码
    目录业务场景1、首先部署好thinkphp6框架2、安装workerman扩展3、生产者4、消费者5、整体测试业务场景 项目公司是主php做开发的,框架为thinkphp。众所周知,...
    99+
    2024-04-02
  • java中RabbitMQ消息队列指的是什么
    这篇文章主要介绍了java中RabbitMQ消息队列指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明RabbitMQ是用Erlang实现的一个高并发高可靠AM...
    99+
    2023-06-15
  • Redis怎么使用ZSET实现消息队列
    这篇文章主要介绍了Redis怎么使用ZSET实现消息队列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis怎么使用ZSET实现消息队列文章都会有所收获,下面我们一起来看看吧。1.redis 用zset做消...
    99+
    2023-07-05
  • java消息队列mq的使用场景是什么
    Java消息队列(MQ)的使用场景主要包括以下几个方面:1. 异步通信:当系统中的不同模块之间需要进行异步通信时,可以使用消息队列来...
    99+
    2023-10-09
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作