如何检查Laravel缓存锁是否已锁定



TLDR:如何检查Laravel Atomic Lock是否已锁定而不必锁定它,并检查$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命令没有运行,也会失败。

因此,我需要一种方法来检查锁是否已经获得,而无需锁定锁。我检查了文档和一些代码,但未能找到解决方案。

这是我们找到的方法


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

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

最新更新