数メガバイト以内の小さなファイルの場合は、file() 関数を使用してファイルを 1 行ずつ配列に読み取ることができます。次に、 array_pop を使用して最後の行を取得します。
ただし、非常に大きなテキスト ファイルの場合、マシンのメモリが十分に大きくないか、PHP 自体にmemory_limit 制限があるため、制限がない場合でもこの方法は適用できません。
他に方法はないのでしょうか?もちろんありますが、既成の機能はないので自分でやる必要があります。
ここでファイルポインターを使用する必要があります。C を勉強したことがある人は、ポインターが何であるかを知っているはずです。この時点では、ファイルは fopen を通じて開かれます。時刻では、ポインタはファイルの先頭を指します。位置は 0 です。 fgets または fgetc を通じてファイルからコンテンツを読み取ると、読み込むにつれてポインタが進みます。これも
です。 リーリー実装の原則は、fgets が改行文字に遭遇するまで、現在のポインター位置から逆方向に指定された長さの文字列を読み取ることです。
下からN行目へのポインタの位置を制御することは可能でしょうか?残念ながらできませんが、 fseek() 関数を使用して、ポインタを末尾や N 位置まで直接移動できます。
まずポインタを最後まで移動し、2つ前の位置に戻り、fgetcで文字を読み込み、その文字が改行文字であるかどうかを判断します。改行文字でない場合は、続けて進みます。前の行の最後の改行文字に戻るまで、fgets を使用して行全体を取り出します。ここでは 2 つの while ループが使用されています。外側のループは取得する行数を制御し、内側のループは fseek アクションを制御します。
関数は次のとおりです:
リーリーPHP で大きなファイルの末尾にある N 行を効率的に読み取る方法に関する上記の推奨事項は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、皆さんにも Bangkejia をサポートしていただければ幸いです。