浅谈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整体框架之基础布局组件

