Heim > Fragen und Antworten > Hauptteil
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. p>
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粉6045078672024-03-28 12:32:45
这就是我们找到的方法
public static function getCacheLockOwner(string $key): string|false { return Cache::lockConnection()->client()->get(Cache::getPrefix().$key); }
如果存在,它将返回锁所有者(一个字符串),否则返回 false。