Как работает функция 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);
Я подозреваю, что вы спрашиваете, потому что размер не так, как вы ожидаете. И я подозреваю, что это не так, как вы ожидаете, потому что вы читаете размер до закрытие файла, когда некоторые записи все еще буферизируются.
Попробуйте закрыть файл первый а затем с помощью 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>';
После некоторых тестов я думаю, что функция 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);
}