浅谈Laravel队列实现原理解决问题记录
《PHP实战:浅谈Laravel队列实现原理解决问题记录》要点: PHP实例问题 PHP实例公司项目使用Laravel的开发的两个项目在同一个测试服务器部署,公用同一个redis.在使用laravel中的队列时,产生冲突干扰. PHP实例查找问题原因 PHP实例在laravel 队列的操作类 PHP实例 // 将一任务推入队列中 public function pushRaw($payload,$queue = null,array $options = []) { $this->getConnection()->rpush($this->getQueue($queue),$payload); return Arr::get(json_decode($payload,true),'id'); } PHP实例从该方法中可以看出Lrarvel队列的redis实现是通过list结构实现的, PHP实例 protected function getQueue($queue) { return 'queues:'.($queue ?: $this->default); } PHP实例所以的redis中list中的key是 PHP实例 // configqueue.php 文件中的redis配置部分 'redis' => [ 'driver' => 'redis','connection' => 'default','queue' => 'default','expire' => 60,], PHP实例至此,两个项目的队列冲突原因就找到了.因为redis队列配置中 PHP实例因为队列监听 监听的队列名称是由 --queue参数决定的,如果不传就是我们上面设置的默认值,若传了就会根据传入的队列名从前往后优先依次处理,具体见代码 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; } } } PHP实例$queue就是--queue=传入的参数,当 $queue不存在是直接调用 PHP实例 // IlluminateQueueRedisQueue.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); } } PHP实例至此搞清了队列执行的原理. PHP实例解决方法 PHP实例将queue的配置文件中默认队列修改为不同的名称,比如: 'queue' => laravel1','queue' => laravel2'. PHP实例队列监听 PHP实例最后 PHP实例遇到问题,莫要病急乱投医.从代码入手,分析理解实现原理,找对点,解决方法也许很简单,希望对大家的学习有所帮助,也希望大家多多支持编程之家. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |