fgets()
ただし、呼び出しのループを使用することは優れたソリューションであり、最も簡単に記述できます。
内部的には、ファイルは8192バイトのバッファーを使用して読み取られますが、コードは各行に対してその関数を呼び出す必要があります。
バイナリファイルを読み取っている場合、技術的には1行が使用可能なメモリよりも大きくなる可能性があります。
このコードは、それぞれ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 |
+------------+-------------+------------------+---------+
時間はリアルタイムで秒単位で測定されます。実際の意味はこちらをご覧ください
\n
)をWindowsマシン(PHP_EOL == '\r\n'
)で解析する可能性があります