我有一个PHP页面,一次只能由一个用户访问。这是一种“穷人的cron”:一个“Javascript”文件,在后台请求。目前我正在考虑创建一个这样的锁文件:
if(file_exists($lockfile) && filemtime($lockfile) + EXPIRES_AFTER > time() ) {
die("// Page is locked.");
}
touch($lockfile);
// do stuff
unlink($lockfile);
echo "// Cron stuff was run";
但是我不确定file_exists
和touch
调用之间是否存在非常短的机会窗口,其中另一个页面请求可以检查文件是否存在并且看到它不是'在那里。我们可能在这里谈论微秒,所以我想知道我真正需要开始担心的请求数量。
答案 0 :(得分:2)
您编写的代码中没有原子性,所以是的,存在竞争条件。
答案 1 :(得分:2)
如果你想精确地 ,那么请使用不同的方法,因为检查和锁之间有一段时间。
两种可能的实施方式:
使用flock: https://secure.php.net/manual/en/function.flock.php
使用像STM这样的东西: 例如。打开锁定文件以追加,在其中写入内容,关闭句柄。然后读回文件,如果它只有你写入的文件,那么你就获得了锁。
除此之外,您的原始代码可能不会导致任何问题。
答案 2 :(得分:1)