Heim  >  Fragen und Antworten  >  Hauptteil

Laravel-Cache-Sperre bereits gesperrt?

TLDR: Wie überprüfe ich, ob eine Laravel-Atomsperre gesperrt ist, ohne sie zu sperren und den Rückgabewert des $lock->get()-Aufrufs zu überprüfen?

Ich habe mehrere Laravel-Befehle, die über den Scheduler ausgeführt werden. Ein Befehl ist nicht geplant und wenn er ausgeführt wird, sollten keine anderen Befehle ausgeführt werden. Also habe ich die atomare Cache-Sperre von Laravel wie folgt eingeführt:

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();
    }
}

Dies funktioniert wie erwartet. Wenn jedoch mehrere dieser Befehle parallel ausgeführt werden, scheint es manchmal, dass die Sperre über die checkSetupRunning-Funktion eines anderen Befehls erworben wurde und daher fehlschlägt, obwohl der Setup-Befehl nicht ausgeführt wird.

Ich brauche also eine Möglichkeit, zu überprüfen, ob die Sperre erworben wurde, ohne die Sperre zu sperren. Ich habe die Dokumentation und etwas Code überprüft, konnte aber keine Lösung finden.

P粉818561682P粉818561682226 Tage vor478

Antworte allen(1)Ich werde antworten

  • P粉604507867

    P粉6045078672024-03-28 12:32:45

    这就是我们找到的方法

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

    如果存在,它将返回锁所有者(一个字符串),否则返回 false。

    Antwort
    0
  • StornierenAntwort