当前位置:首页 > 日记 > 正文

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

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

问题

公司项目使用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.phppublic 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

最后

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

相关文章

下载站mime属性设置 让IIS支持.apk

下载站mime属性设置 让IIS支持.apk

支持,文件下载,属性设置,下载站,电脑软件,下载站mime属性设置,让您的服务器支持.apk/ipa/beb/pxl/dmg等文件下载,如果是IIS6.0,让看下图:打开HTTP头--MIME类型---进行相应的设置。一般软件下载.torrentapplication/octet-stream.7zapplication/…

怎么使用cdr中的将文本转换成表格

怎么使用cdr中的将文本转换成表格

文本,转换成,表格,电脑软件,cdr,“将文本转换成表格”你是否玩过?我将在这里讲述怎么使用CDR里面表格中“将文本转换成表格”应用,希望对大家有所帮助!此表格轮廓粗细、轮廓颜色、填充颜色,文本内容中字体选择、大小变化都…

nodejs个人博客开发第二步 入口文

nodejs个人博客开发第二步 入口文

文件,个人博客,第二步,入口,电脑软件,本文为大家分享了nodejs个人博客开发的入口文件,具体内容如下错误处理中间件定义错误处理中间件必须使用4个参数,否则会被作为普通中间件/*错误处理器*/application.use(function(err,req,res,next){ con…

PS是如何绘制多彩羽毛的

PS是如何绘制多彩羽毛的

绘制,羽毛,多彩,电脑软件,PS,制作羽毛和颜色,效果是神奇的! 软件名称:Adobe PS图象处理软件8全绿色中文版软件大小:150.1mb更新时间:2015-11-04 1。创建一张地图大小的背景地图,并将背景色设置为黑色。 2。使用钢笔工具和转换工具 3,然后构建一个…

jquery uploadify隐藏上传进度的实

jquery uploadify隐藏上传进度的实

方法,上传,进度,电脑软件,jquery,在配置中添加如下参数即可'onInit': function () { $("#upload_excel-queue").hide(); },以上这篇jquery uploadify隐藏上传进度的实现方法就是小编分享给大家的全部内容了,希望能给大家…

PS图象处理软件CS6油画过滤器创建

PS图象处理软件CS6油画过滤器创建

过滤器,图象,处理软件,效果,电脑软件,今天,我们使用PS图象处理软件CS6油画过滤中文版创建油画效果的教程,很简单,新手,下面用小编辑了解它! PS图象处理软件的CS6油画过滤器创建油画效果的方法 1。用Ctrl + o键打开一个材质镜像文件。 2。选择…

如何制作ppt模板图文教程

如何制作ppt模板图文教程

图文教程,模板,电脑软件,ppt,如何制作ppt模板呢?我身边的朋友很多都请教我怎么制作ppt模板方法,其实制作ppt模板非常的简单,但是制作出漂亮的ppt模板,就需要长时间的积累,今天小编就简单说下制作ppt模板的方法。注意:以ppt2003为例,ppt2007操作步…

如何修改支付宝帐号中的手机号码(图

如何修改支付宝帐号中的手机号码(图

帐号,支付宝,图形,修改,手机号码,有时丢了手机,怕别人用手机偷Alipay账号里的钱,可以马上登录Alipay,修改绑定手机号码,操作方法如下: 首先,找一台电脑上网,打开浏览器,打开支付宝官方网站,用你的账号登录。 然后,点我的账户(下图)。 (如下所示)。 (如…

PS是怎样综合在路上游泳的效果的

PS是怎样综合在路上游泳的效果的

的是,游泳,路上,效果,是怎样,今天我们来看一下PS中合成的技术,这是一个人在路上游泳的效果。请看下面的细节。 软件名称:Adobe PS图象处理软件8全绿色中文版软件大小:150.1mb更新时间:2015-11-04 1,为道路和游泳打开材料。 2,人物被粗略地剪到道…

oracle求字符串长度函数length |

oracle求字符串长度函数length |

字符串长度,函数,简介,电脑软件,oracle,lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节length(string)计算string所占的字符长度:返回字符串的长度,单位是字符对于单字节字符,LENGTHB和LENGTH是一样的.如可以用length(…

PSCS6倾斜位移营创建的小人国的形

PSCS6倾斜位移营创建的小人国的形

位移,小人,形象,电脑软件,这个PS图象处理软件CS6新功能添加,今天要介绍的这一功能是什么,相信有iPhone / iPad的朋友,应该不陌生,它是轴通过轴和模具,模具,你可以创造出有趣的图像像小人国,没想到这个功能现在PS图象处理软件CS6也,其用法与iOS操作…

使用NFC标签电话的手机可以阅读(解

使用NFC标签电话的手机可以阅读(解

解决方案,标签,电话,电脑软件,NFC,问题: 带有NFC标签的手机,设置功能,如关闭声音+开启振动,其他手机阅读,你能做到吗 答案uff1a 从理论上讲,只要A和B手机具有相同的内部命令,同样的品牌是常用的,但不同的品牌并不一定。 例如,通过电话定闭语音命…