>백엔드 개발 >PHP 튜토리얼 >php fseek 함수를 사용하여 대용량 파일을 읽는 두 가지 방법의 자세한 예

php fseek 함수를 사용하여 대용량 파일을 읽는 두 가지 방법의 자세한 예

怪我咯
怪我咯원래의
2017-07-09 10:21:371363검색

php에서 파일을 읽는 것은 매우 간단하지만, 읽은 파일이 매우 큰 경우 어떻게 해결하나요? fseek를 사용하여 대용량 파일을 직접 조작할 수 있습니다. 이 글에서는 fseek 함수를 사용하여 대용량 파일을 읽는 방법을 소개합니다. 대용량 파일을 읽으려면

php를 참조하는 것이 가장 일반적입니다. 파일의 모든 내용을 메모리로 읽을 필요는 없지만 포인터를 통해 직접 작동하므로 효율성이 매우 효율적입니다. 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으로 문의하세요.