>  기사  >  백엔드 개발  >  PHP fseek 기능을 사용하여 대용량 파일을 읽는 두 가지 방법

PHP fseek 기능을 사용하여 대용량 파일을 읽는 두 가지 방법

高洛峰
高洛峰원래의
2016-12-20 15:28:161660검색

PHP가 대용량 파일을 읽는 가장 일반적인 방법은 fseek 함수를 사용하는 것입니다. 파일의 모든 내용을 메모리로 읽어올 필요는 없지만 포인터를 통해 직접 작동하므로 사용 시 효율성이 매우 높습니다. fseek 파일을 조작하는 방법은 다양하며 효율성이 약간 다를 수 있습니다. 다음은 일반적으로 사용되는 두 가지 방법입니다.

방법 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를 사용하여 코드 끝부터 읽습니다. 파일이지만 이때는 비트 단위로 읽는 것이 아니고, 데이터를 한 조각씩 읽을 때마다 읽은 데이터를 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 기능을 사용하여 대용량 파일을 읽는 두 가지 방법에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

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