【问题标题】:How does PHP fstat() function work?PHP fstat() 函数是如何工作的?
【发布时间】:2018-12-10 10:16:21
【问题描述】:

PHP fstat() 函数是如何工作的?

函数是否在每次调用时从磁盘读取文件大小?

或者该函数是否根据执行的所有写入操作计算大小?

例子:

$filename='abc.txt';

$fp=fopen($filename, 'a');

$fstat=fstat($fp);
echo 'Size: '.$fstat['size'].'<br><br>';

echo 'Writing...<br><br>';
fwrite($fp, 'xx');
fwrite($fp, 'yyyy');
// ...
// Some number of fwrite() opertions
// ...
fwrite($fp, 'zzzzzz');

$fstat=fstat($fp);
echo 'Size after writing: '.$fstat['size'].'<br>';
// Does the size is read from disk or is calculated based on earlier writing operations?

fclose($fp);

【问题讨论】:

  • 每次fstat 调用都会从磁盘读取。
  • 您认为某些事情没有按预期工作吗?然后你应该改写你的问题。此外,请记住,结果可能会得到cached

标签: php performance filesize fstat


【解决方案1】:

我怀疑您之所以问是因为尺寸不符合您的预期。而且我怀疑这与您期望的不一样,因为当某些写入仍在缓冲时,您在关闭文件之前读取了 的大小。

尝试关闭文件,然后使用stat()

$filename='abc.txt';
$fp=fopen($filename, 'a');

$fstat=fstat($fp);
fwrite($fp, 'xx');
fwrite($fp, 'yyyy');
...
...
fclose($fp);


$stat=stat($filename);
echo 'Size after writing: '.$stat['size'].'<br>';

【讨论】:

    【解决方案2】:

    经过一些测试,我认为函数 fstat() 计算大小,因为它比使用 clearstatcache() 的 filesize() 快得多。

    代码:

    for (/*loop for 10 000 files*/) {
        fwrite($fp, '123');
        $fstat=fstat($fp);
        fwrite($fp, '123');
        $fstat=fstat($fp);
        fwrite($fp, '123');
        $fstat=fstat($fp);
    }
    

    类似于(在性能上):

    // Here filesize() is BUFFERED and gives wrong results
    for (/*loop for 10 000 files*/) {
        fwrite($fp, '123');
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        $fsize=filesize($filename);
    }
    

    比:

    // Here filesize() reads size on every call
    for (/*loop for 10 000 files*/) {
        fwrite($fp, '123');
        clearstatcache();
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        clearstatcache();
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        clearstatcache();
        $fsize=filesize($filename);
    }
    

    比:

    // Here filesize() reads size on every call
    for (/*loop for 10 000 files*/) {
        fwrite($fp, '123');
        clearstatcache(true, $filename);
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        clearstatcache(true, $filename);
        $fsize=filesize($filename);
    
        fwrite($fp, '123');
        clearstatcache(true, $filename);
        $fsize=filesize($filename);
    }
    

    【讨论】:

    • 您是如何衡量性能的?对于这么小的文件,这应该几乎是不可能的
    • 我已经测量了 10 000 个不同大小的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多