2016-03-14 57 views
0

長時間讀取器,但第一次張貼海報。從工作守護進程運行的隊列命令中更改laravel緩存前綴不起作用

我一直在抨擊我的頭上一個顯然很簡單的問題,但目前似乎沒有解決方案。這裏什麼都不做......

我們運行一個Laravel 5.1 API,它在某些情況下將使用各種軟件包和設置的服務器實例排隊。每個實例都有一個特定的ID,它包含在隊列項目數據中。該實例ID又被用作Redis緩存鍵的前綴。例如:「instance-0:clients:list」用於在實例ID爲0上運行的客戶端列表。「cache.prefix」配置設置通過具有當前實例ID的中間件進行更新。

各種創建/更新/刪除端點「忘記」緩存鍵,然後在調用列表/顯示端點時重新生成緩存鍵。當這些操作直接通過API端點發生時,一切都很好,並且很好。如果我用「artisan queue:work」手動運行隊列,它也可以工作。

但是...

常規隊列運行通過supervisord一個守護進程。當隊列作爲守護進程運行時,緩存前綴永遠不會改變,因爲(我猜測)它在運行給定隊列項時不會通過中間件。如果我手動將隊列作爲守護程序運行(而不是通過supervisord),也會發生這種情況。我試過通過\ Config :: set('cache.prefix','instance -X')以及putenv('CACHE_PREFIX = instance-X')強制設置值,但它們沒有效果在緩存存儲本身使用的實際前綴上。我能夠成功設置它的唯一方法是在「.env」文件中設置CACHE_PREFIX,但它不適用於out體系結構。我們在Docker容器中運行API和工作者實例,並且工作者並不特定於任何給定的API實例,因此將實例ID包含在隊列項目數據中供以後使用。

所以,我有種股票,我可以如何設置每個隊列項目的緩存前綴。這甚至有可能嗎?任何幫助將不勝感激!

問候,

克里斯托弗

回答

0

嘗試方法緩存:: setPrefix( '實例-X')。它會強制爲給定請求更改緩存前綴。它應該爲你工作,因爲我有一個類似的用例,但我需要它來管理我的緩存。它可能會也可能不會工作,我沒有用隊列測試過,但由於緩存前綴在laravel中被會話和隊列驅動共享,所以它應該可以工作。

只是爲了清楚該方法不會影響配置值。如果在運行該方法後立即使用config('cache.prefix')來獲取緩存前綴,那麼該值仍然會在配置文件中。

相關問題