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";
?>
答案 0 :(得分:5)
这可能与您调用fgets
的方式有关。从手册中可以看出,如果你将第二个参数排除在外,那么:
如果没有指定长度,它将继续从流中读取,直到它到达行尾。
如果您使用的数据有很长的行(例如:“HelloWorld”100,000次= 1,000,000个字符),那么它必须阅读整个内容。
再次,从手册:
如果文件中的大多数行都大于8KB,则脚本指定最大行长度的资源效率更高。