【发布时间】: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 文件的大小更昂贵。请注意,与文件系统的任何交互仍然比仅与内存交互要昂贵得多。