PHP -fstat()是否被缓存?

7gs2gvoe  于 2022-11-21  发布在  PHP
关注(0)|答案(2)|浏览(712)

我想知道是否缓存了fstat()
文档中对此只字未提。
(PHP第8.1.12节)

编辑:

我做了很多测试,我现在有一个准确的答案。

简介:

我创建了两个脚本,并同时运行它们(用独占锁(flock($fp, LOCK_EX))* 锁定文件指针,以防止它们相互覆盖)和单独运行它们;我在一个循环的不同阶段打印了print_rfstat($fp)),导致写入了5 MB的数据。
返回realpath缓存项的数组。键是原始路径项,值是数据项的数组,包含解析的路径、过期日期和该高速缓存中保存的其他选项。
以检测realpath高速缓存,并运行测试,试图通过clearstatcache()清除和不清除该高速缓存。

发生了什么事

我发现缓存的唯一项是“atime”
上次访问时间(Unix时间戳)
,但最令人不安的是:它不会被放入realpath缓存中,因此,如果通过clearstatcache()清除它,什么也不会改变,您只能重新启动计算机或等待该高速缓存超时来清除数据(取决于计算机)。
幸运的是,这并不影响我,因为我只需要“大小”元素的fstat。遗憾的是,我不能给予你的源代码,因为我改变了很多时间,尝试所有的可能性。
感谢所有花时间帮助我的人。

  • 注意:在两个文件中使用flock,如果您只在一个文件中使用它,另一个文件将能够写入之前运行过的未锁定文件
    结论

fstat的唯一缓存元素是atime,但它没有缓存在realpath中,因此clearstatcache()是无用的。

ibps3vxo

ibps3vxo1#

我做了一个快速的演示,* 似乎 * 显示它是 * 没有 * 缓存。但是,**看到编辑,**太

$filename = __DIR__.'/test.txt';

@unlink($filename);
touch($filename);
echo 'STAT - Size before write: '.stat($filename)['size'], PHP_EOL;
file_put_contents($filename, 'test');
echo 'STAT - Size after write: '.stat($filename)['size'], PHP_EOL;
clearstatcache();
echo 'STAT - Size after cache clear: '.stat($filename)['size'], PHP_EOL;

@unlink($filename);
touch($filename);
$fp = fopen($filename, 'wb');
echo 'FSTAT - Size before write: '.fstat($fp)['size'], PHP_EOL;
fwrite($fp, 'test');
echo 'FSTAT - Size after write: '.fstat($fp)['size'], PHP_EOL;
clearstatcache();
echo 'FSTAT - Size after cache clear: '.fstat($fp)['size'], PHP_EOL;

输出量:

STAT - Size before write: 0
STAT - Size after write: 0
STAT - Size after cache clear: 4
FSTAT - Size before write: 0
FSTAT - Size after write: 4
FSTAT - Size after cache clear: 4

编辑

通过@Barmar,我再次运行了测试,这次只使用了一个fstat调用,然后是一个sleep(10),然后我用vim手动快速更新了文件,然后是最后一个fstat调用(都在同一个请求中),该调用返回为 cached
然后我又运行了一次,这次是在最后的fstat之前使用clearstatcache(),它没有变化。我还尝试了wr模式对fopen的测试,结果相同。
所以看起来确实有某种缓存,但我不认为它是统计缓存。

9gm1akwq

9gm1akwq2#

作为补充:
我也做了克里斯·哈斯在评论中描述的测试。

/*
 * Open test.txt with a text editor
 * Run this script
 * Add some characters in the editor and save while the script is running
 */
$file = __DIR__.'/../test/test.txt';
$fp = fopen($file,'r');
$size[] = fstat($fp)['size'];
sleep(10);
$size[] = fstat($fp)['size'];
var_dump($size);
//array(2) { [0]=> int(3) [1]=> int(13) }

对于Win10和小型Linux上的PHP,结果相同。

相关问题