Laravel 缓存锁已经锁定了吗?
P粉818561682
P粉818561682 2024-03-27 13:28:19
0
1
429

TLDR:如何检查 Laravel 原子锁是否已被锁定,而无需锁定它并检查 $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-command 没有运行。

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

P粉818561682
P粉818561682

全部回复(1)
P粉604507867

这就是我们找到的方法

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!