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

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

高洛峰
高洛峰オリジナル
2016-12-20 15:28:161602ブラウズ

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 サイトに注目してください。

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