>  기사  >  백엔드 개발  >  PHP에서 대용량 파일 끝에 N 줄을 읽는 방법

PHP에서 대용량 파일 끝에 N 줄을 읽는 방법

墨辰丷
墨辰丷원래의
2018-06-02 09:12:471455검색

이 글은 주로 PHP로 대용량 파일의 끝 N줄을 읽는 방법을 소개합니다. 관심있는 친구들이 참고하시면 좋을 것 같습니다.

몇 메가바이트 이내의 작은 파일의 경우 file() 함수를 사용하여 파일을 한 줄씩 배열로 읽어온 다음 array_pop을 사용하여 마지막 줄을 가져올 수 있습니다.

그러나 매우 큰 텍스트 파일의 경우 시스템 메모리가 충분히 크지 않거나 PHP 자체에 memory_limit 제한이 있으므로 이 방법은 적용할 수 없습니다.

다른 방법은 없나요? 물론 있습니다만, 미리 만들어진 기능이 없어서 직접 하셔야 합니다.

여기서 파일 포인터를 사용해야 합니다. C를 공부한 사람들은 포인터가 무엇인지 알아야 합니다. 일반 용어로 말하면, PHP에서는 파일을 읽지 않습니다. 이번에는 파일의 시작 부분을 가리킵니다. 포인터 위치도 0입니다. fgets나 fgetc를 통해 파일의 내용을 읽으면 읽은 만큼 포인터가 앞으로 이동합니다. 이것이 바로

의 원리입니다.

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


즉, fgets는 개행 문자를 만날 때까지 현재 포인터 위치에서 뒤로 지정된 길이의 문자열을 읽습니다.

그럼 포인터 위치를 아래에서 N번째 줄까지 조절이 가능한가요? 불행히도 그렇지 않습니다. 하지만 fseek() 함수를 통해 포인터를 끝과 뒤로 N 위치로 직접 이동할 수 있습니다.

먼저 포인터를 끝으로 이동시킨 후 2자리 뒤로 이동하여 fgetc를 통해 문자를 읽고 해당 문자가 개행 문자인 "n"인지 판단한 다음 계속 진행합니다. 한 위치로 돌아가서 다시 판단하세요. 이전 줄의 끝 개행 문자로 돌아갈 때까지 fgets를 사용하여 전체 줄을 꺼내세요. 여기서는 두 개의 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 빨간 봉투 무작위 생성 알고리즘에 대한 자세한 설명

php3가지 구현 방법 버퍼링되지 않은 쿼리 API

위 내용은 PHP에서 대용량 파일 끝에 N 줄을 읽는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.