php での
ファイルの読み取りは非常に簡単ですが、読み取られたファイルが非常に大きい場合は、どうすれば解決できますか?この記事では、fseek 関数を使用して大きなファイルを読み取る方法を紹介します。必要な場合は、fseek 関数を使用するのが最も一般的な方法です。ファイルの内容をすべてメモリに読み込む必要はなく、ポインタを介して直接操作するため、効率が非常に高くなります。 fseek を使用してファイルを操作する場合、さまざまな方法があり、効率は若干異なる場合があります。は、一般的に使用される 2 つの方法です。 方法 1:
最初に fseek を通じてファイルの最後の EOF を見つけ、次に最後の行の開始位置を見つけ、この行のデータを取得して、次の行を見つけます。開始位置、次にこの行の位置など、$num 行が見つかるまで続きます。実装コードは次のとおりです:コード全体の実行には 0.0095 (秒) かかります
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 つずつ読み取っていません。ただし、データが読み取られるたびに、読み取られたデータが 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 サイトの他の関連記事を参照してください。