unlink/file_exists and file not found

7
我在我的应用程序中有这段代码,经常会被多个用户同时运行导致竞争条件。
clearstatcache(TRUE, $filepath);
if(file_exists($filepath)) unlink($filepath);

但是,对于这行代码,我每天仍然会遇到几个错误,比如:

unlink(file): 没有那个文件或目录

服务器运行Apache 2.2和PHP 5.3.3。我知道这是竞争问题,但认为@操作符只是不好。我首先尝试了clearstatcache()没有任何参数,结果还是出现了同样的错误。 我应该如何正确地解决它?


@experimentX 但它就在那里,不是吗? - Pekka
@Pekka 嗯,我没有看到上面的代码有任何缺陷,我猜。 - S L
clearstatcache() 是如何工作的?当使用 file_exists() 进行测试时,文件存在,然后它就不存在了... 是否有多个进程同时试图删除同一个文件呢? - Capsule
是的,有几个进程在运行这段代码。这是一个很大的竞态条件。我的问题是我需要检查是否已经删除了文件,所以@和在unlink之后使用file_exists()进行检查可能就可以了。 - Cédric Girard
也许存在一些与操作系统相关的“缓存”吗?尝试在clearstatcache()之后添加usleep(100) - powtac
显示剩余3条评论
2个回答

6

你可以尝试这个

if(@unlink($path)) {
  echo "Deleted file "; 
}
else{
  echo "File can't be deleted";
}

我认为这将非常好;


1
他在问题中说他不想使用这个。尽管如此,这可能是唯一的选择。 - Pekka

5

如评论中所述,我的需求是确保我已经删除了文件,而不是知道哪个进程删除了它,因此

@unlink($filepath);
clearstatcache(TRUE, $filepath);
if(file_exists($filepath)) throw new Exception('file not deleted : ' . $filepath);

也许有一种更好的方法。

非常感谢您的帮助,使用多个注释来思考另一种方式真的更容易了很多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接