如何仅减慢当前请求? sleep() 没有按预期工作

How to slow down only the current request? sleep() doesn't work as expected

有时我的应用程序需要等待一些东西。例如,在缓存的情况下:如果在缓存中找不到对象,则脚本会在其键下设置一个特殊值,象征着当前正在计算其值的事实,并在完成后将其写入。如果在计算时另一个客户端请求同一个对象,那么脚本将不会重新计算它,而只是等待第一个。当然,这是一个简化的解释。我不知道如何正确地做到这一点,但这种行为在我看来是非常合乎逻辑的。

在测试一个完全不同的东西的过程中,今天我运行遇到了问题。

<?php
echo time() . "\n";
sleep(10); // usleep() has the same effect
echo time() . "\n";

同一秒,我在浏览器中的两个选项卡中打开此页面,希望看到相同的数字,但是......后面打开的tab,除了它的延迟之外,不知为什么,就是在等待第一个tab的延迟(蹩脚的措辞,但你明白我的意思),所以我看到了这样的东西:1615749037 1615749047, 1615749047 1615749057.如果您添加更多选项卡,那么下一个选项卡将等待所有之前的选项卡。

它伤了我的脑袋。这根本不是我想象的那样,并且在这种错觉中迷惑了很多年。我目前无法找到有关此的任何信息。首先,我对如何达到预期结果很感兴趣。为什么 sleep() 会这样,我似乎开始猜测了,但如果您能分享一些信息,我会很高兴。谢谢!

UPD。为了以防万一,我检查了这个:如果我添加 header('Cache-Control: no-cache, no-store, must-revalidate'),那么对我来说没有任何改变。但是如果我从不同的浏览器打开标签页,那就没问题了。

看了两个问题

1。如何在处理第一个请求的同时阻止第二个请求?

为此,我的答案是锁。对于 PHP,我特别推荐 Symfony lock component。您将使两个请求都获得一个锁,并且仅在完成并生成缓存后才释放它。

2。为什么同时触发的 2 个请求会互相等待?

我猜你的浏览器有一些内置的 queuing/caching 或诸如此类的东西。您可以通过在不同的浏览器中打开相同的页面来查看是否会产生不同的结果来避免这种情况。