Как работает функция PHP fstat ()? - PullRequest
0 голосов
/ 02 июля 2018

Как работает функция 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);

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

После некоторых тестов я думаю, что функция fstat () вычисляет размер, потому что он намного быстрее, чем filesize () с clearstatcache ().

код:

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);
}
0 голосов
/ 02 июля 2018

Я подозреваю, что вы спрашиваете, потому что размер не так, как вы ожидаете. И я подозреваю, что это не так, как вы ожидаете, потому что вы читаете размер до закрытия файла, когда некоторые записи все еще буферизируются.

Попробуйте закрыть файл сначала , а затем использовать 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>';
...