ホームページ  >  記事  >  バックエンド開発  >  大きなファイルを読み取るためにphpのfseek関数を実装する2つの方法

大きなファイルを読み取るためにphpのfseek関数を実装する2つの方法

墨辰丷
墨辰丷オリジナル
2018-06-01 10:01:361623ブラウズ

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

array_keys は配列のキー名を返します

以上が大きなファイルを読み取るためにphpのfseek関数を実装する2つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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