ホームページ  >  記事  >  バックエンド開発  >  php fseek 関数を使用して大きなファイルを読み取る 2 つの方法の詳細な例

php fseek 関数を使用して大きなファイルを読み取る 2 つの方法の詳細な例

怪我咯
怪我咯オリジナル
2017-07-09 10:21:371341ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。