感谢所有的答案和评论。我对以下功能进行了基准测试:
使用以下代码(省略了while循环):
// fgets ( same code in the question )
$tokens = explode('||', $line);
$a = $tokens[0];
list($b, $c, $d) = explode('|', $tokens[1]);
$result[$a] = array('a' => $a, 'b' => $b, 'c' => $c, 'd' => $d);
// fgetcsv
ini_set('auto_detect_line_endings',TRUE);
list($a, $nouse1, $b, $c, $d, $nouse2, $nouse3) = fgetcsv($fh, 200, '|');
$result[$a] = array('a' => $a, 'b' => $b, 'c' => $c, 'd' => $d);
// stream_get_line
$line = stream_get_line($fh, 200, PHP_EOL);
$tokens = explode('||', $line);
if(count($tokens) != 3) {
continue;
}
$a = $tokens[0];
list($b, $c, $d) = explode('|', $tokens[1]);
$result[$a] = array('a' => $a, 'b' => $b, 'c' => $c, 'd' => $d);
// stream_get_line + str_getcsv
$line = stream_get_line($fh, 200, PHP_EOL);
list($a, $nouse1, $b, $c, $d, $nouse2, $nouse3) = str_getcsv($line, '|');
$result[$a] = array('a' => $a, 'b' => $b, 'c' => $c, 'd' => $d);
// fgets + str_getcsv
$line = fgets($fh);
list($a, $nouse1, $b, $c, $d, $nouse2, $nouse3) = str_getcsv($line, '|');
$result[$a] = array('a' => $a, 'b' => $b, 'c' => $c, 'd' => $d);
他们在同一台测试机器中解析相同路径中的相同文本文件。行格式为:
AAA||BBB|C|DDD||
这是结果(测试了 3 次并取平均时间):
没想到,fgetcsv()
是最慢的。但为什么 ?
旁注: stream_get_line()
仅在 PHP 5 中可用。