Laravel 快取鎖已經上鎖了嗎?
P粉818561682
P粉818561682 2024-03-27 13:28:19
0
1
500

TLDR:如何檢查 Laravel 原子鎖是否已被鎖定,而無需鎖定它並檢查 $lock->get() 呼叫的回傳值?

我有多個透過調度程式執行的 Laravel 指令。未調度一個命令,如果該命令正在運行,則不應運行其他命令。因此我從 Laravel 引入了原子緩存鎖,如下所示:

private function checkSetupRunning(){
    $lock = Cache::store('locks')->getStore()->lock(
        self::RUNNING_KEY, // name for the lock
        owner: self::class
    );

    if ($lock->get(fn() => null) === false) {
        throw new SetupRunningException();
    }
}

這確實按預期工作,但是,當並行運行多個這些命令時,有時似乎已經通過另一個命令的 checkSetupRunning 函數獲取了鎖定,因此失敗,即使 setup-command 沒有運行。

所以我需要一種方法來檢查是否已經獲得了鎖,而不需要鎖定鎖。我檢查了文檔和一些程式碼,但未能找到解決方案。

P粉818561682
P粉818561682

全部回覆(1)
P粉604507867

這就是我們找到的方法

 public static function getCacheLockOwner(string $key): string|false
 {
        return Cache::lockConnection()->client()->get(Cache::getPrefix().$key);
 }

如果存在,它將傳回鎖所有者(一個字串),否則傳回 false。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板