关于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分支

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

sleep 的问题,sleep 会阻塞当前连接下的 PHP 原生 session,用 Cache::lock('foo', 10)

参考: sleep 文档下的笔记

6个月前 评论
jatdung (作者) 6个月前
梦想星辰大海 6个月前
狒狒达人 6个月前
讨论数量: 13
梦想星辰大海

memcached 不是单点

6个月前 评论

是 nginx/php-fpm 模式下吗

6个月前 评论
清风 (楼主) 6个月前
Tacks (作者) 6个月前
清风 (楼主) 6个月前
MArtian 6个月前
清风 (楼主) 6个月前

sleep 的问题,sleep 会阻塞当前连接下的 PHP 原生 session,用 Cache::lock('foo', 10)

参考: sleep 文档下的笔记

6个月前 评论
jatdung (作者) 6个月前
梦想星辰大海 6个月前
狒狒达人 6个月前

这里的解答都不对,具体看这篇帖子: 博客:一个有趣的锁问题

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!