我的工作流程非常简单:
clearstatcache()
clearstatcache()
最后,is_file()
返回false
一段时间,然后在我稍后刷新10秒后决定返回true
。
看起来像是缓存问题,不是吗?
这是我的一段代码:
// step 1
$path = 'file_to_delete.jpg';
unlink($path);
// is_file($path) returns false here -- normal behavior
// step 2
clearstatcache();
// step 3 -- some stuff going on on an uploaded image, that leads to:
imagejpeg($imagetosave, $path, 80);
// step 4
clearstatcache();
// is_file() returns false, i have to wait a couple of seconds before it starts returning true
感谢您的帮助!
修改
鉴于我的所有答案,问题不是 似乎 来自clearstatcache()
。
但是,如果我添加,当我覆盖文件(因此其现有的状态不会改变)时,is_file()
会返回良好的结果。但当其现有状态实际发生变化时,就会出现问题。如果错误不是来自clearstatcache()
,那会很奇怪,对吗? (或确实与此缓存有关的东西)
答案 0 :(得分:2)
我同意@hakre,检查创建/删除的结果。
即使拉斯穆斯自己recommends it:
,也不是快而肮脏的[2011-03-31 08:34 UTC] rasmus@php.net
你们发现stat缓存是按请求的,对吧?只有你 如果你A,需要在file_exists()调用之前清除stat缓存。 为它做了一个统计,并且B.在这个上创建或删除了它 请求。在这种情况下,您不需要再次对其进行统计 create / delete的成功状态将告诉您文件是否为 有没有。也许对于长期运行的守护进程或类似的东西 变得更成问题,但对于典型的Web请求,stat缓存 通常会为您节省数十个系统调用。
如果你真的坚持使用clearstatcache()
,那么我想到的唯一的事情(除写缓存之外)是,你有一个非常巨大的上传文件夹,包含数千个文件。
在一个文件夹中包含许多文件肯定会减慢重新说明的速度。
如果是这样,请尝试减少文件数量以获得统计效果,例如通过创建多个文件夹,为上传文件名的每个初始字符添加一个文件夹,例如upload/a/
,upload/b/
等。