【问题标题】:PHP - Is fstat() cached?PHP - fstat() 是否已缓存?
【发布时间】:2022-11-17 04:47:25
【问题描述】:

我想知道 fstat() 是否被缓存。

文档对此只字不提。

(PHP 8.1.12)

【问题讨论】:

标签: php caching documentation


【解决方案1】:

我做了一个快速演示出现表明它是不是缓存。然而,看到编辑,

$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 调用,然后是一个睡眠(10),然后我用 vim 手动快速更新文件,然后最后一个 fstat 调用(全部在同一个请求),然后那个返回缓存.

然后我再次运行它,这次在最后一个 fstat 之前使用 clearstatcache(),它没有改变。我还尝试了 wr 模式对 fopen 的测试,结果相同。

所以似乎确实有某种缓存,但我不认为它是统计缓存。

【讨论】:

  • 我希望对流执行操作会自动清除缓存。您需要从不同的进程进行写入,以查看该进程是否维护缓存。
  • 谢谢@Barmar,我试图将它与stat 进行比较,这是我看到大多数人遇到麻烦的地方,因为本地 FS 更改并不总是很明显。但我刚刚用 sleep 进行了测试,用 vim 快速写入文件,然后检查统计信息,显示它已缓存。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多