什么是PHP的fgets()使它在大文件上如此可怕?

时间:2008-10-28 00:52:46

标签: php fgets

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 个答案:

答案 0 :(得分:5)

这可能与您调用fgets的方式有关。从手册中可以看出,如果你将第二个参数排除在外,那么:

  

如果没有指定长度,它将继续从流中读取,直到它到达行尾。

如果您使用的数据有很长的行(例如:“HelloWorld”100,000次= 1,000,000个字符),那么它必须阅读整个内容。

再次,从手册:

  

如果文件中的大多数行都大于8KB,则脚本指定最大行长度的资源效率更高。