我想知道是否缓存了fstat()。
文档中对此只字未提。
(PHP第8.1.12节)
编辑:
我做了很多测试,我现在有一个准确的答案。
简介:
我创建了两个脚本,并同时运行它们(用独占锁(flock($fp, LOCK_EX))* 锁定文件指针,以防止它们相互覆盖)和单独运行它们;我在一个循环的不同阶段打印了print_r(fstat($fp)),导致写入了5 MB的数据。
返回realpath缓存项的数组。键是原始路径项,值是数据项的数组,包含解析的路径、过期日期和该高速缓存中保存的其他选项。
以检测realpath高速缓存,并运行测试,试图通过clearstatcache()清除和不清除该高速缓存。
发生了什么事
我发现缓存的唯一项是“atime”
上次访问时间(Unix时间戳)
,但最令人不安的是:它不会被放入realpath缓存中,因此,如果通过clearstatcache()清除它,什么也不会改变,您只能重新启动计算机或等待该高速缓存超时来清除数据(取决于计算机)。
幸运的是,这并不影响我,因为我只需要“大小”元素的fstat。遗憾的是,我不能给予你的源代码,因为我改变了很多时间,尝试所有的可能性。
感谢所有花时间帮助我的人。
- 注意:在两个文件中使用flock,如果您只在一个文件中使用它,另一个文件将能够写入之前运行过的未锁定文件
结论
fstat的唯一缓存元素是atime,但它没有缓存在realpath中,因此clearstatcache()是无用的。
2条答案
按热度按时间ibps3vxo1#
我做了一个快速的演示,* 似乎 * 显示它是 * 没有 * 缓存。但是,**看到编辑,**太
输出量:
编辑
通过@Barmar,我再次运行了测试,这次只使用了一个
fstat
调用,然后是一个sleep(10),然后我用vim手动快速更新了文件,然后是最后一个fstat
调用(都在同一个请求中),该调用返回为 cached。然后我又运行了一次,这次是在最后的
fstat
之前使用clearstatcache()
,它没有变化。我还尝试了w
和r
模式对fopen
的测试,结果相同。所以看起来确实有某种缓存,但我不认为它是统计缓存。
9gm1akwq2#
作为补充:
我也做了克里斯·哈斯在评论中描述的测试。
对于Win10和小型Linux上的PHP,结果相同。