首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么来自同一个IP的第二个客户机在显示页面之前有20秒的超时时间?

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

Stack Overflow用户
提问于 2016-02-22 13:55:50
回答 1查看 126关注 0票数 4

编辑:

我将标题从“为什么第二个客户端在第一个客户端调用完成之前不能访问该页面?”改为“为什么第二个客户端在第一个客户端调用完成之前不能访问该页面?”“为什么来自同一个IP的第二个客户端在显示页面之前有20秒超时时间?”。因此,在所有编辑之前,的推理是不一样的.

这里有两个URL:/home/sleep

/home显示主页

/sleep睡10秒

我有两个客户:

Client 1/sleep ->等待10秒

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

Client 1/sleepClient 2/sleep ->客户机1等待10秒,客户端2等待20 secs

为什么?我怎么才能逃避呢?

如果这个页面已经被其他人调用了,我想显示一些特殊的东西。

这是我的代码:

代码语言:javascript
复制
$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中有一个无限循环,我将在客户机2上“已经运行”,但是有20秒超时。

我只是想知道现在是什么时候。

Edit2

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

客户端1 on /sleep

代码语言:javascript
复制
public function sleep() {
    // this is the endpoint of http://127.0.0.1/sleep
    sleep(300);
}

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

代码语言:javascript
复制
public function sleep() {
    // this is the endpoint of http://127.0.0.1/sleep
    die('hello');
}

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

Edit3

Client 1127.0.0.1/sleep ->等待10秒

Client 2192.168.0.10/sleep ->等待10秒

我的结论是,问题是来自同一个IP的请求。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-22 17:11:16

根据PHP文档flock() on windows执行强制锁定。。这意味着系统在文件操作(包括fopen )上为您检查锁。

在Linux上,它将执行咨询锁定,这要求访问文件的进程通过调用flock()来获得锁。

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

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

编辑:我意识到我并没有真正回答你的第一个问题:如何避免这个问题。一个简单的解决方法是将代码移动到linux服务器上,如果这对您来说是可能的话。否则,我建议您搜索如何进行咨询锁定窗口。

相关问题: Windows与Linux上PHP flock()行为的差异

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35555480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档