Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 파일의 마지막 줄 읽는 방법

PHP에서 파일의 마지막 줄만 읽어야 하는 경우가 종종 있습니다. 예를 들어 로그 파일의 최신 기록을 확인하거나, 대용량 파일 전체를 메모리에 불러오지 않고 마지막 데이터만 가져와야 할 때 유용합니다. 이럴 때 fseek() 함수를 활용하면 파일 끝에서부터 역방향으로 탐색하여 효율적으로 마지막 줄만 추출할 수 있습니다.

예제 코드

$line = '';
$f = fopen('data.txt', 'r');
$cursor = -1;
fseek($f, $cursor, SEEK_END);
$char = fgetc($f);
// 파일 끝의 개행 문자 제거
while ($char === "\n" || $char === "\r") {
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}
// 다음 줄의 시작 또는 첫 개행 문자를 만날 때까지 읽기
while ($char !== false && $char !== "\n" && $char !== "\r") {
    // 새로 읽은 문자를 앞에 추가
    $line = $char . $line;
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}
echo $line;

위 코드를 실행하면 텍스트 파일의 마지막 줄이 읽혀 화면에 출력됩니다.

코드 동작 원리

먼저 fopen() 함수로 텍스트 파일을 읽기 모드('r')로 열고, 커서 위치를 -1로 설정합니다. 이는 파일의 맨 끝에서 한 칸 앞을 가리키는 초기 위치입니다. 이후 fseek() 함수를 사용해 파일 포인터를 파일의 끝(SEEK_END)으로 이동시킵니다.

첫 번째 while 루프에서는 파일 끝에 남아 있는 개행 문자(\n 또는 \r)를 제거합니다. 파일 끝에 빈 줄이 여러 개 있더라도 실제 내용이 있는 마지막 줄까지 커서를 계속 앞으로 이동시킵니다.

두 번째 while 루프에서는 개행 문자를 만나거나 파일의 시작에 도달할 때까지 문자를 하나씩 읽어들입니다. 읽은 문자를 $line 변수의 앞에 추가(prepend)하는 방식이므로, 역방향으로 읽은 문자들이 올바른 순서대로 조립됩니다. 마지막으로 echo 문을 통해 완성된 마지막 줄을 출력합니다.

참고 사항

이 방식은 file() 함수나 fgets()로 파일 전체를 처음부터 순회하는 것보다 대용량 파일에서 성능 면에서 유리합니다. 또한 Windows(\r\n)와 Unix/Linux(\n) 계열의 개행 문자 차이를 모두 처리하므로 운영체제에 관계없이 안정적으로 동작합니다.