我刚刚花了几个小时为代码中的一个奇怪错误疯狂。我使用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会这样缓存结果为什么在更改文件时缓存没有失效?更快的性能是很好的,但肯定不会以牺牲有效的结果为代价。
正如您已经提到的,缓存结果是为了提高性能。与文件系统交互比大多数其他操作更昂贵。
当文件系统发生更改时,缓存不会失效的原因是,监视成本会更高。这将否定缓存结果的价值。
至于为什么在某些情况下这样做会以产生意想不到的结果为代价:这只是一种权衡。如果不是这样做的话,我认为询问为什么没有缓存结果也是一个同样合理的问题。无论哪种方式,要么由您缓存结果,要么刷新内置缓存。