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.
這就是我們找到的方法
public static function getCacheLockOwner(string $key): string|false { return Cache::lockConnection()->client()->get(Cache::getPrefix().$key); }
如果存在,它將返回鎖所有者(一個字符串),否則返回 false。