关于Laravel Cache原子锁的问题
public function test()
{
$lock = Cache::lock('foo');
if ($lock->get()) {
dump(1);
sleep(10);
$lock->release();
} else {
dump(0);
}
}
环境是
linux
memcached
php7.4
Laravel 6
问题
这段控制器代码,我间隔3秒左右连续打开两个浏览器窗口访问,为啥两个窗口都是打印出
1
,并且两个窗口都阻塞了。按理说应该是第一个窗口阻塞并打印出1
,第二个窗口应该是进入else
打印出0
呀
期望
第二窗口检测到锁被其他窗口获取时,不进入阻塞等待,而是直接进入else
分支
sleep
的问题,sleep 会阻塞当前连接下的 PHP 原生 session,用Cache::lock('foo', 10)
参考: sleep 文档下的笔记