为什么PHP缓存filesize()调用


Why does PHP cache filesize() calls?

我刚刚花了几个小时为代码中的一个奇怪错误疯狂。我使用TwitterStreamingneneneba API制作了一个PHP应用程序,在文件的末尾编写新的tweet。有时,包含推文的文件似乎毫无理由地被覆盖。

最终,我在php文档的filesize()页面中发现了这一点:

注意:此函数的结果是缓存的。参见clearstatcache()了解更多详细信息。

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

然后在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会这样缓存结果为什么在更改文件时缓存没有失效?更快的性能是很好的,但肯定不会以牺牲有效的结果为代价。

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

当文件系统发生更改时,缓存不会失效的原因是,监视成本会更高。这将否定缓存结果的价值。

至于为什么在某些情况下这样做会以产生意想不到的结果为代价:这只是一种权衡。如果不是这样做的话,我认为询问为什么没有缓存结果也是一个同样合理的问题。无论哪种方式,要么由您缓存结果,要么刷新内置缓存。