使用fgets()调用循环是一个很好的解决方案,并且最容易编写,但是:
即使在内部使用8192字节的缓冲区读取文件,您的代码仍然必须为每一行调用该函数。
从技术上讲,如果您正在读取二进制文件,则单行可能大于可用内存。
此代码读取每个文件的大小为8kB的块,然后计算该块中换行的数量。
function getLines($file)
{
$f = fopen($file, 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
return $lines;
}
如果每行的平均长度最大为4kB,则您将已经开始保存函数调用,并且在处理大文件时这些函数可能会累加起来。
基准测试
我对一个1GB的文件进行了测试;结果如下:
+-------------+------------------+---------+
| This answer | Dominic's answer | wc -l |
+------------+-------------+------------------+---------+
| Lines | 3550388 | 3550389 | 3550388 |
+------------+-------------+------------------+---------+
| Runtime | 1.055 | 4.297 | 0.587 |
+------------+-------------+------------------+---------+
时间以秒为单位实时测量,请参阅此处的实际含义