>백엔드 개발 >PHP 문제 >PHP에서 대용량 파일 끝에 n 줄을 읽는 효율적인 방법

PHP에서 대용량 파일 끝에 n 줄을 읽는 효율적인 방법

藏色散人
藏色散人원래의
2021-07-23 09:23:332443검색

PHP에서 큰 파일의 끝에서 n 줄을 읽는 방법: 먼저 포인터를 끝으로 이동하고 두 위치 뒤로 이동한 다음 fgetc를 통해 문자를 읽고 마지막으로 fgets를 직접 사용하여 전체 줄을 가져옵니다. 그냥 나오세요.

PHP에서 대용량 파일 끝에 n 줄을 읽는 효율적인 방법

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

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 비디오 튜토리얼"

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

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