ホームページ  >  記事  >  バックエンド開発  >  PHPで大きなファイルの末尾にあるN行を読み取る方法

PHPで大きなファイルの末尾にあるN行を読み取る方法

墨辰丷
墨辰丷オリジナル
2018-06-02 09:12:471447ブラウズ

この記事では、PHP で大きなファイルの末尾の N 行を読み取る方法を主に紹介します。興味のある方はぜひ参考にしてください。

数メガバイト以内の小さなファイルの場合は、file() 関数を使用してファイルを 1 行ずつ配列に読み取り、array_pop を使用して最後の行を取得できます。

しかし、非常に大きなテキストファイルの場合、マシンのメモリが十分に大きくないか、PHP 自体にmemory_limit制限があるため、制限がない場合でもこの方法は適用できません。

他に方法はないのでしょうか?もちろんありますが、既成の機能はないので自分でやる必要があります。

ここでファイルポインターを使用する必要があります。C を勉強したことがある人は知っていると思いますが、PHP では、この時点ではファイルは読み込まれていません。今回は、ポインタの位置も 0 です。 fgets または fgetc を介してファイルからコンテンツを読み取ると、読み込んだ量だけポインタが進みます。これも

​​

の原理です。

while(!feof($fp)){
$data.=fgets($fp,4096);
}


、つまり、fgets は、改行文字が見つかるまで、指定された長さの文字列を現在のポインター位置から逆方向に読み取ります。

では、下からN行目へのポインタの位置を制御することは可能でしょうか?残念ながらできませんが、 fseek() 関数を使用して、ポインタを末尾や N 位置まで直接移動できます。

まずポインタを最後まで移動し、2つ戻り、fgetcで文字を読み込み、その文字が改行文字であるかどうかを判定します。改行文字でない場合は、続けて実行します。 1 つ前の位置に戻って再度判断し、前の行の最後の改行文字に戻るまで、fgets を使用して行全体を取り出します。ここでは 2 つの while ループが使用されています。外側のループは取得する行数を制御し、内側のループは fseek アクションを制御します。

関数は次のとおりです:

/**
 * 取文件最后$n行
 * @param string $filename 文件路径
 * @param int $n 最后几行
 * @return mixed false表示有错误,成功则返回字符串
 */
function FileLastLines($filename,$n){
  if(!$fp=fopen($filename,'r')){
    echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
    return false;
  }
  $pos=-2;
  $eof="";
  $str="";
  while($n>0){
    while($eof!="\n"){
      if(!fseek($fp,$pos,SEEK_END)){
        $eof=fgetc($fp);
        $pos--;
      }else{
        break;
      }
    }
    $str.=fgets($fp);
    $eof="";
    $n--;
  }
  return $str;
}
echo nl2br(FileLastLines('sss.txt',4));

概要: 上記がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:

現在のファイルの親ディレクトリを取得するPHP実装の概要

phpWeChatの赤い封筒のランダム生成アルゴリズムの詳細な説明

php実装する3つの方法非バッファークエリ API

以上がPHPで大きなファイルの末尾にあるN行を読み取る方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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