file_exists似乎无法正常工作

wjh*_*sch 5 php file-permissions file-exists

我有一个我想要执行的php脚本,只有当脚本的其他实例尚未运行时才会执行.我有这个代码:

$lockfile = __DIR__.'/lock.file';

if(file_exists($lockfile) == false)
{
    echo 'no lockfile. Job will execute.';
    $handle = fopen($lockfile, 'x') or die('Cannot open file:  '.$lockfile);
    $data = 'This is the lockfile';
    fwrite($handle, $data);
    fclose($lockfile);

    createLinks();

    unlink($lockfile);
}
else
{
    echo 'Lockfile present, job will not execute. Please try again later';
}
Run Code Online (Sandbox Code Playgroud)

但它无法正确检查文件是否存在.如果我用浏览器调用脚本,则会正确创建lock.file(我可以用ftp查看),然后删除.但是,我仍然可以同时多次运行脚本.如果我自己用ftp创建一个lock.file,它就不会执行脚本.我现在一直在寻找几个小时,它能成为什么?也许我很蠢,但我觉得这应该有用,对吧?

编辑:Jep,flock做到了.非常感谢!最终代码:

$lockfile = __DIR__.'/lock.file';
$handle = fopen($lockfile, "x");

if(flock($handle, LOCK_EX))
{
    echo 'no lockfile. Job will execute.';

    $data = 'This is the lockfile';
    fwrite($handle, $data);

    createLinks();

    fclose($lockfile);  
    unlink($lockfile);
}
else
{
    echo 'Lockfile present, job will not execute. Please try again later';
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*o D 4

来自以下文档file_exists

注意:该函数的结果被缓存。有关更多详细信息,请参阅clearstatcache()。

和:

您还应该注意,PHP 不会缓存有关不存在文件的信息。因此,如果您对不存在的文件调用 file_exists(),它将返回 FALSE,直到您创建该文件。如果您创建了该文件,即使您随后删除了该文件,它也会返回 TRUE。然而 unlink() 会自动清除缓存

尝试将您的功能更改为:

if(file_exists($lockfile) == false)
{
    clearstatcache();
    ...
Run Code Online (Sandbox Code Playgroud)

看看clearstatcache()