gpt4 book ai didi

php - 为什么来自同一 IP 的第二个客户端在显示页面之前有 20 秒的超时?

转载 作者:可可西里 更新时间:2023-10-31 23:28:54 25 4
gpt4 key购买 nike

编辑:

我已将标题从“为什么第二个客户端在第一个客户端的调用结束之前无法访问该页面?”更改为“为什么来自同一 IP 的第二个客户端具有显示页面前 20 秒超时?”。 因此所有编辑前的推理都不相同。


这里有 2 个 URL:/home/sleep

/home 显示首页

/sleep 休眠 10 秒


我有 2 个客户:

客户端 1:/sleep -> 等待 10 秒

客户端 1:/sleep客户端 2:/home -> 客户端 1 等待 10 秒,客户端 2 立即加载页面。

客户端 1:/sleep客户端 2:/sleep -> 客户端 1 等待 10 秒,客户端 2 等待 20


为什么?我该如何避免这种情况?

如果此页面已被其他人调用,我想显示一些特别的内容。

这是我的代码:

$fileHandler = fopen('process.lock', 'w');
$hasLock = flock($fileHandler, LOCK_EX | LOCK_NB);
if (!$hasLock) {
return('already running'); // it never goes here.
}

for ($i = 0; $i < 10; ++$i) {
echo nl2br("$i" . PHP_EOL);
ob_flush();
flush();
sleep(1);
}

flock($fileHandler, LOCK_UN);
fclose($fileHandler);

编辑

真是巧合。事实上,它会在 20 秒的等待时间返回“已经运行”。这意味着如果我在 for 中有一个无限循环,我会在 Client 2 上“已经运行”但有 20 秒的超时。

我只是想知道它是什么超时。

编辑2

我做了进一步的测试,以证明它来自 Apache 或 PHP 配置,而不是我使用的函数:

客户端 1/sleep 上:

public function sleep() {
// this is the endpoint of http://127.0.0.1/sleep
sleep(300);
}

然后我编辑这个文件,以便 Client 2 调用该函数:

public function sleep() {
// this is the endpoint of http://127.0.0.1/sleep
die('hello');
}

如果我从 5 秒间隔(对文件进行更改的时间)开始运行我的两个客户端,第二个客户端在打印 hello 之前仍然等待 20 秒。

编辑3

客户端 1:127.0.0.1/sleep -> 等待 10 秒

客户端 2:192.168.0.10/sleep -> 等待 10 秒,没有延迟

我断定问题出在同一个IP的请求上。为什么?

最佳答案

根据 PHP documentation , flock()windows performs Mandatory locking 上.这意味着系统会为您检查包括 fopen 在内的文件操作的锁。

在 Linux 上,它会执行建议锁定,这要求访问文件的进程通过调用 flock() 来尝试获取锁。

Windows 变体允许您锁定一次并阻止所有其他程序,包括那些不知道您的代码的程序。

您的第二个客户端在等待锁释放的 fopen() 调用上阻塞。

编辑:我确实意识到我还没有真正回答您的第一个问题:如何避免这种情况。如果可能的话,一个简单的解决方法是将您的代码移动到 Linux 服务器。否则,我建议您搜索如何在 Windows 上进行建议锁定。

相关问题: PHP flock() behaviour difference on Windows vs Linux

关于php - 为什么来自同一 IP 的第二个客户端在显示页面之前有 20 秒的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com