PHP が大きなファイルを読み取る最も一般的な方法は、fseek 関数を使用することです。ファイルの内容をすべてメモリに読み取る必要はなく、ポインターを介して直接動作するため、fseek を使用すると非常に効率的です。ファイルに対して操作を実行する 操作にはさまざまな方法があり、効率は若干異なる場合があります。一般的に使用される 2 つの方法を以下に示します。
方法 1:
最初に fseek を通じてファイルの最後の EOF を検索し、次に検索します。最後の行の先頭、開始位置、この行のデータを取得し、次の行の開始位置を見つけて、この行の位置を取得するなど、$num 行が見つかるまで続きます。実装コードは次のとおりです:
コード全体の実行には 0.0095 (s) かかります
function tail($fp,$n,$base=5) { assert($n>0); $pos = $n+1; $lines = array(); while(count($lines)< =$n){ try{ fseek($fp,-$pos,SEEK_END); } catch (Exception $e){ fseek(0); break; } $pos *= $base; while(!feof($fp)){ array_unshift($lines,fgets($fp)); } } return array_slice($lines,0,$n); } var_dump(tail(fopen("access.log","r+"),10));
方法 2:
引き続き fseek を使用してファイルの末尾から読み取りますが、今回は 1 つずつ読み取るのではなく、 1 つずつ読み取り、データが読み取られるたびに、読み取られたデータが buf に配置され、改行文字の数 (n) を使用して、データの最後の $num 行が読み取られたかどうかが判断されます。実装コードは次のとおりです
コードの実行が完了するまでに 0.0009(s) かかります
$fp = fopen($file, "r"); $line = 10; $pos = -2; $t = " "; $data = ""; while ($line > 0) { while ($t != "n") { fseek($fp, $pos, SEEK_END); $t = fgetc($fp); $pos --; } $t = " "; $data .= fgets($fp); $line --; } fclose ($fp); echo $data
読んでいただきありがとうございます。皆さんのお役に立てれば幸いです。このサイトのサポートに感謝します。
php fseek 関数を使用して大きなファイルを読み取る 2 つの方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。