摘要:在使用中的隊列時,產生沖突干擾。文件中的配置部分至此,兩個項目的隊列沖突原因就找到了。隊列監聽最后遇到問題,莫要病急亂投醫。從代碼入手,分析理解實現原理,找對點,解決方法也許很簡單,。
問題
公司項目使用Laravel的開發的兩個項目在同一個測試服務器部署,公用同一個redis。在使用laravel中的隊列時,產生沖突干擾。
查找問題原因在laravel 隊列的操作類 IlluminateQueueRedisQueue.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 實例化的時候從 configqueue.php 配置中加載的 "queue" => "default", $queue 是添加隊列時$this->dispatch( new jobClass()->onQueue($queue) )傳入的。
// configqueue.php 文件中的redis配置部分 "redis" => [ "driver" => "redis", "connection" => "default", "queue" => "default", "expire" => 60, ],
至此,兩個項目的隊列沖突原因就找到了。因為redis隊列配置中 "queue" => "default" 都使用的默認的default,所以當共用redis時,默認的隊列list 都是"queue:default",所以導致了沖突。
因為隊列監聽 監聽的隊列名稱是由 --queue參數決定的,如果不傳就是我們上面設置的默認值,若傳了就會根據傳入的隊列名從前往后優先依次處理,具體見代碼IlluminateQueueWorker.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()會嘗試從指定隊列或默認隊列中獲取隊列任務
// 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); } }
至此搞清了隊列執行的原理。
解決方法將queue的配置文件中默認隊列修改為不同的名稱,比如: "queue" => laravel1","queue" => laravel2"。
隊列監聽 php artisan queue:listen redis --queue=laravel1,syncExpress
最后遇到問題,莫要病急亂投醫。從代碼入手,分析理解實現原理,找對點,解決方法也許很簡單,^_^。
歡迎關注我的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25700.html
摘要:大家有好的文章可以在評論下面分享出來共同進步本文鏈接數組使用之道程序員進階學習書籍參考指南教你在不使用框架的情況下也能寫出現代化代碼巧用數組函數框架中間件實現沒錯,這就是面向對象編程設計模式需要遵循的個基本原則令人困惑的在中使用協程實現多任 大家有好的文章,可以在評論下面分享出來, 共同進步! 本文github鏈接 php PHP 數組使用之道 PHP程序員進階學習書籍參考指南 教你...
摘要:對于包含通配符的事件名,會被統一放入數組中,是用來創建事件對應的的如果是監聽器是類,去創建監聽類創建的時候,會判斷監聽對象是監聽類還是閉包函數。對于閉包監聽來說,會再包裝一層返回一個閉包函數作為事件的監聽者。 事件系統 Laravel 的事件提供了一個簡單的觀察者實現,能夠訂閱和監聽應用中發生的各種事件。事件機制是一種很好的應用解耦方式,因為一個事件可以擁有多個互不依賴的監聽器。lar...
摘要:幾小時前剛剛發布的為隊列功能提供了官方原生的驅動器,完全取代了本軟件包的功能。不過這也并不意味著就是虛擬主機沒戲,必須云主機起跳的小網站殺手。性能確實低下受制于,絕對禁止用于大數量高密度任務的場合。虛擬主機肯定不會提供。 幾小時前剛剛發布的 Larevel 5.0 為隊列功能提供了官方原生的database驅動器,完全取代了本軟件包的功能。 對于Laravel 5及以上版本,本文的內...
摘要:已經取消了參數,都用來執行。取數據的過程事物處理已經打開。取得符合條件的隊列后程序會更新該條數據,并且更新完后即。 connections => [ .... database => [ driver => database, table => jobs, queue => defaul...
摘要:正確做法是給加索引,還有聯合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 有心的同學應該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。 本文地址 時間點:2017-11 一個16年畢業生所經歷的php面試 一、什么是面試 二、面試準備 1. 問:什么時候開始準備? 2. 問:怎么準備? 三、面試...
閱讀 2566·2023-04-25 18:13
閱讀 780·2021-11-22 12:10
閱讀 2978·2021-11-22 11:57
閱讀 2142·2021-11-19 11:26
閱讀 2175·2021-09-22 15:40
閱讀 1463·2021-09-03 10:28
閱讀 2707·2019-08-30 15:53
閱讀 1954·2019-08-30 15:44