编辑:
我将标题从“为什么第二个客户端在第一个客户端调用完成之前不能访问该页面?”改为“为什么第二个客户端在第一个客户端调用完成之前不能访问该页面?”“为什么来自同一个IP的第二个客户端在显示页面之前有20秒超时时间?”。因此,在所有编辑之前,的推理是不一样的.
这里有两个URL:/home和/sleep。
/home显示主页
/sleep睡10秒
我有两个客户:
Client 1:/sleep ->等待10秒
Client 1:/sleep,Client 2:/home ->客户机1等待10秒,客户端2立即加载页面。
Client 1:/sleep,Client 2:/sleep ->客户机1等待10秒,客户端2等待20 secs
为什么?我怎么才能逃避呢?
如果这个页面已经被其他人调用了,我想显示一些特殊的东西。
这是我的代码:
$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
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秒。
Edit3
Client 1:127.0.0.1/sleep ->等待10秒
Client 2:192.168.0.10/sleep ->等待10秒
我的结论是,问题是来自同一个IP的请求。为什么?
发布于 2016-02-22 17:11:16
根据PHP文档,flock() on windows执行强制锁定。。这意味着系统在文件操作(包括fopen )上为您检查锁。
在Linux上,它将执行咨询锁定,这要求访问文件的进程通过调用flock()来获得锁。
Windows变体允许您锁定一次并阻止所有其他程序,包括那些不了解您的代码的程序。
第二个客户端正在阻塞fopen()调用,等待锁释放。
编辑:我意识到我并没有真正回答你的第一个问题:如何避免这个问题。一个简单的解决方法是将代码移动到linux服务器上,如果这对您来说是可能的话。否则,我建议您搜索如何进行咨询锁定窗口。
https://stackoverflow.com/questions/35555480
复制相似问题