3

我的工作流程非常简单:

  1. 我删除一个文件
  2. 我打电话clearstatcache()
  3. 我保存一个新文件
  4. 我打电话clearstatcache()

尽管如此,最后还是会is_file()返回false一段时间,然后再true例如在我刷新 10 秒后决定返回。

它看起来像一个缓存问题,不是吗?

这是我的一段代码:

// 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(),那会很奇怪,对吧?(或确实与此缓存相关的内容)

4

1 回答 1

2

我同意@hakre,检查创建/删除的结果。

这不是快速和肮脏的,甚至拉斯穆斯本人也推荐它

[2011-03-31 08:34 UTC] rasmus@php.net

你们意识到统计缓存是每个请求的,对吧?如果你 A. 为它做了一个统计,你只需要在 file_exists() 调用之前清除统计缓存,并且 B. 在那个请求上创建或删除它。在这种情况下,您不需要再次统计它,因为创建/删除的成功状态会告诉您文件是否存在。也许对于长时间运行的守护进程或其他一些问题,这会成为一个更大的问题,但对于典型的 Web 请求,统计缓存通常会为您节省数十个系统调用。

如果你真的坚持使用clearstatcache(),我唯一想到的(除了写缓存)就是,你有一个非常大的上传文件夹,包含数千个文件。

在一个文件夹中有很多很多文件肯定会减慢重新陈述的速度。

如果是这样,请尝试减少文件数量以获得统计性能,例如,通过创建多个文件夹,为上传文件名的每个初始字符创建一个文件夹,例如upload/a/,upload/b/等。

于 2011-12-05T09:49:40.310 回答