0

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);
4

2 回答 2

0

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

尝试先关闭文件,然后使用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>';
于 2018-07-02T09:55:45.557 回答
0

After some tests I think the function fstat() calculates the size because it is much more faster than filesize() with clearstatcache().

The code:

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

is similar (in preformance) to:

// 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);
}

is faster than:

// 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);
}

and than:

// 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);
}
于 2018-07-02T10:21:37.837 回答