1

我有一个 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调用之间是否有一个非常短的机会窗口,另一个页面请求可以检查文件是否存在并看到它不存在。我们可能在这里谈论微秒,所以我想知道我真正需要开始担心的请求数量。

4

3 回答 3

3

您编写的代码中没有原子性,所以是的,存在竞争条件。

于 2012-08-05T10:13:28.897 回答
3

如果您想真正精确地执行此操作,请使用不同的方法,因为在检查和锁定之间存在一些时间。

两种可能的实现:

  1. 使用羊群: https ://secure.php.net/manual/en/function.flock.php

  2. 使用 STM 之类的东西:例如打开锁定文件进行追加,在其中写入一些内容,关闭句柄。然后读回文件,如果它只有你写入的内容,那么你已经获得了锁。

除此之外,您的原始代码可能不会引起任何问题。

于 2012-08-05T10:19:21.420 回答
1

您的代码有竞争条件。相反,使用 O_EXCL dio_open文件。如果文件已经存在,这将失败。完成后取消链接。

唯一需要注意的是如果系统或脚本在文件存在时崩溃,则脚本将永远不会再次运行。如果您对此感到担心,请检查文件的年龄(如果您未能创建它),如果它比脚本可能花费的最长时间要旧,请取消链接。

使用羊群是另一种选择。

于 2012-08-05T10:33:44.657 回答