【问题标题】:Why does PHP cache filesize() calls?为什么 PHP 缓存 filesize() 调用?
【发布时间】:2015-03-23 17:32:45
【问题描述】:

我刚刚花了几个小时为我的代码中的一个奇怪的错误发疯。我正在使用 Twitter Streaming API 制作一个 PHP 应用程序,将新推文写入文件末尾。有时,包含推文的文件会被无缘无故地覆盖。

最后我发现这个埋在filesize() page in the php docs:

注意:这个函数的结果是缓存的。见clearstatcache() 了解更多详情。

原来 PHP 正在缓存我在存储推文的文件上调用 filesize() 的结果。然后当我再次调用 filesize() 时,它实际上返回了一个完全错误价值。 (文件的旧长度,来自上一次函数调用)。

然后在docs page for clearstatcache(),我发现了这个:

当您使用 stat()、lstat() 或在 受影响的函数列表(如下),PHP 缓存那些信息 函数返回以提供更快的性能

再往下一点:

受影响的功能包括stat()lstat()file_exists()is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup()fileowner()filesize()filetype()fileperms()

为什么 PHP 会缓存这样的结果? 为什么更改文件时缓存没有失效?更快的性能很好,但肯定不会以牺牲有效结果为代价。

【问题讨论】:

  • 为什么 PHP 会缓存这样的结果?更快的性能很棒你已经回答了你的问题
  • 为什么文件被修改后缓存不会自己失效?
  • 想象一个 2GB 的文件。如果 php 每次新建时都必须计算大小,仅因为您更改一两个字母,那将是一个巨大的性能损失!而且我仍然没有真正看到您期望的答案是什么
  • “……孩子们,这就是我们总是想先阅读手册的原因。”
  • @Rizier123 我不确定这是否正确。文件系统应该维护某种文件大小的记录。在 linux 中,我相信它在 inode 中。检查 2GB 文件的大小不应该比检查 2KB 文件的大小更昂贵。请注意,与文件系统的任何交互仍然比仅与内存交互要昂贵得多。

标签: php caching


【解决方案1】:

正如您已经提到的,结果被缓存以提高性能。与文件系统交互比大多数其他操作更昂贵。

当文件系统发生变化时缓存不会失效的原因是监控会更加昂贵。这将否定缓存结果的价值。

至于为什么这样做会在某些情况下以产生意想不到的结果为代价:这只是一种权衡。如果不是以这种方式完成,我认为询问为什么不缓存结果将是一个同样有效的问题。无论哪种方式,都由您决定是否缓存结果,或者刷新内置缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多