Что такого в PHP fgets (), что делает его таким ужасным для больших файлов? - PullRequest
1 голос
/ 28 октября 2008

Что такое реализация fgets(), которая делает его таким ужасным на больших файлах против fread?

Чтобы продемонстрировать, запустите этот код:

<?php
$line = str_repeat('HelloWorld', 100000) . "\n";
for($i=0; $i<10000; ++$i)
    file_put_contents('myfile', $line, FILE_APPEND);
//now we have roughly a 1gig file

// We'll even let fread go first incase
// the subsequent test would have any caching benefits
$fp = fopen('myfile2','r');
$start = microtime(true);
while (fread($fp,4096));
$end = microtime(true);
print ($end-$start) . " using fread\n";
fseek($fp, 0);

$start = microtime(true);
while (fgets($fp));
$end = microtime(true);
print ($end-$start) . " using fgets\n";
?>

1 Ответ

5 голосов
/ 28 октября 2008

Возможно, это как-то связано с тем, как вы звоните fgets. Из руководства написано, что если вы пропустите второй параметр, то:

Если длина не указана, он будет продолжать чтение из потока, пока не достигнет конца строки.

Если данные, с которыми вы работаете, имеют очень длинные строки (например, «HelloWorld» 100 000 раз = 1 000 000 символов), тогда они должны прочитать все это.

Опять из руководства:

Если большинство строк в файле имеют размер больше 8 КБ, для вашего сценария более эффективно использовать максимальную длину строки.

...