Laravel-Cache-Sperre bereits gesperrt?
P粉818561682
P粉818561682 2024-03-27 13:28:19
0
1
487

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粉818561682
P粉818561682

Antworte allen(1)
P粉604507867

这就是我们找到的方法

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

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!