有时我的应用程序需要等待一些东西。例如,在缓存的情况下:如果在缓存中找不到对象,那么脚本会在其键下设置一个特殊值,象征着当前正在计算其值,并在完成后写入该值。如果在计算时另一个客户端请求相同的对象,则脚本不会重新计算该对象,只会等待第一个对象。当然,这只是一个简单的解释。我不知道如何正确地做到这一点,但这种行为在我看来是非常合乎逻辑的。
在测试一个完全不同的东西的过程中,今天我遇到了一个问题。
<?php
echo time() . "n";
sleep(10); // usleep() has the same effect
echo time() . "n";
在同一秒,我在浏览器中的两个选项卡中打开此页面,并希望看到相同的数字。但是……后来打开的选项卡,除了延迟之外,由于某种原因,正在等待第一个选项卡延迟(蹩脚的措辞,但你理解我(,所以我看到这样的内容:1615749037 1615749047
,1615749047 1615749057
。如果添加更多选项卡,则下一个选项卡将等待所有上一个选项卡。
它伤透了我的脑筋。这根本不是我想象的那样,多年来我一直处于这种错觉中。我现在找不到任何关于这方面的信息。首先,我感兴趣的是如何达到预期的结果。我似乎开始猜测sleep((为什么会这样,但如果你能分享一些信息,我会很高兴的。非常感谢。
UPD。为了以防万一,我检查了一下:如果我添加header('Cache-Control: no-cache, no-store, must-revalidate')
,那么对我来说什么都不会改变。但如果我从不同的浏览器打开选项卡,那么就没有问题。
从阅读中我看到了两个问题
1.在处理第一个请求的同时,如何阻止第二个请求
为此,我的答案是锁。对于PHP,我特别推荐使用Symfony锁组件。您将使两个请求都获得一个锁,并且只有在完成并生成缓存后才释放它。
2.为什么同时触发的两个请求会相互等待
我的猜测是,你的浏览器有一些内置的排队/缓存之类的功能。你可以通过在不同的浏览器中打开同一个页面来避免这种情况,看看是否会产生不同的结果。