浅谈Laravel队列实现原理解决问题记录

发布时间 - 2026-01-11 02:52:25    点击率:

问题

公司项目使用Laravel的开发的两个项目在同一个测试服务器部署,公用同一个redis。在使用laravel中的队列时,产生冲突干扰。

查找问题原因

在laravel 队列的操作类Illuminate\Queue\RedisQueue.php中可以看到pushRaw()方法:

// 将一任务推入队列中
public function pushRaw($payload, $queue = null, array $options = [])
  {
    $this->getConnection()->rpush($this->getQueue($queue), $payload);

    return Arr::get(json_decode($payload, true), 'id');
  }

从该方法中可以看出Lrarvel队列的redis实现是通过list结构实现的,rpush(key, value)是将value推入键值为key的redis队列,key的值则是通过$this->getQueue($queue) 获取到的

protected function getQueue($queue)
  {
    return 'queues:'.($queue ?: $this->default);
  }

所以的redis中list中的key是 'queues:'.($queue ?: $this->default);拼接的,$this->default 的值是 RedisQueue 实例化的时候从config\queue.php配置中加载的 'queue' => 'default',$queue 是添加队列时$this->dispatch( new jobClass()->onQueue($queue) )传入的。

// config\queue.php 文件中的redis配置部分
'redis' => [
      'driver'   => 'redis',
      'connection' => 'default',
      'queue'   => 'default',
      'expire'   => 60,
    ],

至此,两个项目的队列冲突原因就找到了。因为redis队列配置中 'queue' => 'default' 都使用的默认的default,所以当共用redis时,默认的队列list 都是'queue:default',所以导致了冲突。

因为队列监听 监听的队列名称是由 --queue参数决定的,如果不传就是我们上面设置的默认值,若传了就会根据传入的队列名从前往后优先依次处理,具体见代码Illuminate\Queue\Worker.php中:

protected function getNextJob($connection, $queue)
  {
    if (is_null($queue)) {
      return $connection->pop();
    }

    foreach (explode(',', $queue) as $queue) {
      if (! is_null($job = $connection->pop($queue))) {
        return $job;
      }
    }
  }

$queue就是--queue=传入的参数,当 $queue不存在是直接调用$connection->pop()当参数存在时会将参数解析,优先处理排在前面的队列名称,将队列名称传入pop($queue), pop()会尝试从指定队列或默认队列中获取队列任务

// Illuminate\Queue\RedisQueue.php
public function pop($queue = null)
  {
    $original = $queue ?: $this->default;

    $queue = $this->getQueue($queue);

    if (! is_null($this->expire)) {
      $this->migrateAllExpiredJobs($queue);
    }

    $job = $this->getConnection()->lpop($queue);

    if (! is_null($job)) {
      $this->getConnection()->zadd($queue.':reserved', $this->getTime() + $this->expire, $job);

      return new RedisJob($this->container, $this, $job, $original);
    }
  }

至此搞清了队列执行的原理。

解决方法

将queue的配置文件中默认队列修改为不同的名称,比如: 'queue' => laravel1','queue' => laravel2'。

队列监听 php artisan queue:listen redis --queue=laravel1,syncExpress

最后

遇到问题,莫要病急乱投医。从代码入手,分析理解实现原理,找对点,解决方法也许很简单,希望对大家的学习有所帮助,也希望大家多多支持。


# Laravel队列实现  # Laravel  # 队列  # laravel5.6 框架邮件队列database驱动简单demo示例  # Laravel使用Queue队列的技巧汇总  # Docker部署Laravel应用实现队列&任务调度  # Laravel 6 将新增为指定队列任务设置中间件的功能  # Laravel 队列使用的实现  # Laravel框架队列原理与用法分析  # Laravel中为什么不使用blpop取队列详析  # 关于 Laravel Redis 多个进程同时取队列问题详解  # 源码分析 Laravel 重复执行同一个队列任务的原因  # Laravel使用消息队列需要注意的一些问题  # Laravel中利用队列发送邮件的方法示例  # 浅析Laravel5中队列的配置及使用  # PHP的Laravel框架中使用消息队列queue及异步队列的方法  # Laravel 4.2 中队列服务(queue)使用感受  # Laravel框架中队列和工作(Queues、Jobs)操作实例详解  # 解决方法  # 都是  # 病急乱投医  # 就会  # 是由  # 则是  # 很简单  # 不存在  # 可以看到  # 可以看出  # 排在  # 传了  # 配置文件  # 大家多多  # 就找  # 键值  # 清了  # 默认值  # 莫要  # 不传 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速完成中国万网建站详细流程?  LinuxCD持续部署教程_自动发布与回滚机制  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Android实现代码画虚线边框背景效果  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  微信小程序 HTTPS报错整理常见问题及解决方案  北京的网站制作公司有哪些,哪个视频网站最好?  如何用wdcp快速搭建高效网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何自定义建站之星网站的导航菜单样式?  C语言设计一个闪闪的圣诞树  网站建设整体流程解析,建站其实很容易!  香港服务器建站指南:免备案优势与SEO优化技巧全解析  简历没回改:利用AI润色让你的文字更专业  Firefox Developer Edition开发者版本入口  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何有效防御Web建站篡改攻击?  如何将凡科建站内容保存为本地文件?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何在阿里云高效完成企业建站全流程?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何在橙子建站上传落地页?操作指南详解  如何快速搭建虚拟主机网站?新手必看指南  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  公司门户网站制作流程,华为官网怎么做?  Laravel如何实现API资源集合?(Resource Collection教程)  如何在阿里云购买域名并搭建网站?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  装修招标网站设计制作流程,装修招标流程?  文字头像制作网站推荐软件,醒图能自动配文字吗?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  教学论文网站制作软件有哪些,写论文用什么软件 ?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  做企业网站制作流程,企业网站制作基本流程有哪些?  EditPlus 正则表达式 实战(3)  详解Huffman编码算法之Java实现  Laravel如何处理文件下载请求?(Response示例)  BootStrap整体框架之基础布局组件