PHP でファイルを読み取るのは非常に簡単ですが、読み取られたファイルが非常に大きい場合は、どうすれば解決できますか? fseek を使用して大きなファイルを直接操作できます。この記事では、PHP が fseek 関数を使用して大きなファイルを読み取る方法を紹介します。
php が大きなファイルを読み取る方法を参照してください。ファイルの内容をすべてメモリに読み込む必要はありませんが、ポインタを介して直接操作する必要があるため、効率が非常に高くなります。 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 を引き続き使用しますが、今回はそうではありませんone by one Read ただし、データが読み取られるたびに、読み取られたデータが 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 は preg_split 関数を使用して、改行とセミコロンを含む文字列を分割します
php以上が大きなファイルを読み取るためにphpのfseek関数を実装する2つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。