ファイルは単なるデータのストリームであり、最初から最後まで読み取られます。OSは、そのファイルでこれまでに読んだ位置を記憶します。必要に応じて、アプリケーションでもこれを行うのは非常に簡単です。ただし、OSは行ではなく、バイト位置のみを考慮します。
52枚のカードのデッキを順番に配ることを想像してみてください。最初のカードを渡します。次回は2.カード。3.カードを配りたいときは、最初から数え始める必要はありません。また、次の利用可能なカードを配るだけで、どこにいたかを覚えておく必要もありません。これが3番目になります。
パフォーマンスのために実際のファイルから読み取ったデータをバッファリングする必要があるため、行を読み取るために必要な作業は少し多いかもしれませんが、最後のデータのオフセットを記録することほど多くはありません。配られた後、次の改行文字を見つけて、それらの2つのポイント間のすべてのデータを渡してください。
システムが気にするのは「次の行」だけなので、PHPもOSも行番号を保持する必要はありません。行番号を知りたい場合は、カウンターを保持し、アプリが行を読み取るたびにカウンターをインクリメントします。
$lineno=0;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
lineno++; // keep track of the line number
...
}