Php (缓存::锁())->;get()--在什么条件下返回false?

Php (缓存::锁())->;get()--在什么条件下返回false?,php,laravel,Php,Laravel,我正在研究在laravel中使用Cache::lock机制,但有些事情我并不清楚 这是他们使用的示例: $lock = Cache::lock('foo', 10); if ($lock->get()) { // Lock acquired for 10 seconds... $lock->release(); } 现在,我的理解是,在正常情况下,如果调用$lock->get()时锁仍在原位,它将等待前一个锁释放,然后继续。对吗?(对我来说,这似乎就是锁的全部意

我正在研究在laravel中使用
Cache::lock
机制,但有些事情我并不清楚

这是他们使用的示例:

$lock = Cache::lock('foo', 10);

if ($lock->get()) {
    // Lock acquired for 10 seconds...

    $lock->release();
}

现在,我的理解是,在正常情况下,如果调用
$lock->get()
时锁仍在原位,它将等待前一个锁释放,然后继续。对吗?(对我来说,这似乎就是锁的全部意义,所以我当然希望这是正确的)


如果这是正确的,那么什么会使
$lock->get()
返回false?如果它期望等待时间超过10秒或类似的时间,它会返回false吗?

在laravel文档和源文件中很难找到与此相关的内容。我能收集到的是,对
Cache::lock
的调用并没有获取它,它似乎只定义了可以锁定的内容

get()
block()
的调用似乎完成了实际的获取

我的假设如下:

  • Cache::lock(foo,n)
    将在
    foo
    上创建一个新锁,该锁最多可保持
    n
  • $lock->get()
    将尝试获取它,如果它已被其他人持有,则返回false
  • $lock->block(n)
    将尝试获取它并阻止最长
    n
    秒,如果在此期间未能获取,它将抛出
    LockTimeoutException
你应该测试它是否真的遵循了这个行为,尽管我不能证实这一点


供参考:


“它将等待上一个锁释放后再继续。正确吗?”不,它不会等待。在您的代码中,它现在的编写方式将始终返回true。如果两个请求同时进入两个锁'foo',第一个
$lock->get()
似乎返回true,第二个返回false,只要第一个请求中没有调用
$lock-release()
。因此
$lock->get()
根本不等待,但是
$lock->block()
会等待,(如果我的假设是正确的,但这是最有意义的)阅读Lock.php中关于block和get的代码,你似乎是对的。block通过一个睡眠循环,它显然每四分之一秒检查一次锁,直到它得到锁,如果它不能在指定的秒数内得到锁,就会出错。谢谢你的回答。我太笨了。如果我只是阅读Laravel文档的其余部分,它会给出一个错误n使用
->block()
等待的示例。