位置: 编程技术 - 正文
推荐整理分享浅谈Laravel队列实现原理解决问题记录(laravel自带队列效率),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:laravel队列消费方式,laravel队列失败了如何处理,laravel自带队列效率,laravel队列消费方式,laravel 队列,laravel自带队列效率,laravel队列的实现原理,laravel队列的实现原理,内容如对您有帮助,希望把文章链接给更多的朋友!
问题
公司项目使用Laravel的开发的两个项目在同一个测试服务器部署,公用同一个redis。在使用laravel中的队列时,产生冲突干扰。
查找问题原因
在laravel 队列的操作类IlluminateQueueRedisQueue.php中可以看到pushRaw()方法:
从该方法中可以看出Lrarvel队列的redis实现是通过list结构实现的,rpush(key, value)是将value推入键值为key的redis队列,key的值则是通过$this->getQueue($queue) 获取到的
所以的redis中list中的key是 'queues:'.($queue : $this->default);拼接的,$this->default 的值是 RedisQueue 实例化的时候从configqueue.php配置中加载的 'queue' => 'default',$queue 是添加队列时$this->dispatch( new jobClass()->onQueue($queue) )传入的。
至此,两个项目的队列冲突原因就找到了。因为redis队列配置中 'queue' => 'default' 都使用的默认的default,所以当共用redis时,默认的队列list 都是'queue:default',所以导致了冲突。
因为队列监听 监听的队列名称是由 --queue参数决定的,如果不传就是我们上面设置的默认值,若传了就会根据传入的队列名从前往后优先依次处理,具体见代码IlluminateQueueWorker.php中:
$queue就是--queue=传入的参数,当 $queue不存在是直接调用$connection->pop()当参数存在时会将参数解析,优先处理排在前面的队列名称,将队列名称传入pop($queue), pop()会尝试从指定队列或默认队列中获取队列任务
至此搞清了队列执行的原理。
解决方法
将queue的配置文件中默认队列修改为不同的名称,比如: 'queue' => laravel1','queue' => laravel2'。
队列监听 php artisan queue:listen redis --queue=laravel1,syncExpress
最后
遇到问题,莫要病急乱投医。从代码入手,分析理解实现原理,找对点,解决方法也许很简单,希望对大家的学习有所帮助,也希望大家多多支持积木网。
php创建多级目录完整封装类操作方法 创建多级目录函数中调用创建指定下的指定文件的函数:publicfunctioncreate_dir($dir,$mode=){returnis_dir($dir)or($this-create_dir(dirname($dir))andmkdir($dir,$mode));}创建
cookie的优化与购物车实例 一Cookie的优化1.1一般而言,我们设置cookie是在php中设置例如:phpsetcookie('testKey1','helloworld',0,'/');//#当expires=0时,此Cookie随浏览器关闭而失效,而在验证的
详谈PHP基础与JS操作的区别(必看篇) 嵌入页面方式JS嵌入方式:script/scriptPHP嵌入方式:php(常用)输出语法Javascript输出1.alert("警告的内容")2.prompt("提示的内容")3.document.write()(页面输出内容)PHP
标签: laravel自带队列效率
本文链接地址:https://www.jiuchutong.com/biancheng/289916.html 转载请保留说明!友情链接: 武汉网站建设