[ php ] fopen, fgets, fclose, fseek, ftell > php

본문 바로가기

사이트 내 전체검색

php

[ php ] fopen, fgets, fclose, fseek, ftell

작성일 18-09-30 18:05

페이지 정보

작성자 웹지기 조회 5,408회 댓글 0건

본문

1. fopen, fgets, fclose
log 파일 또는 txt나 csv로 된 DB파일을 불러올 때 쓰는 함수다.

$file = 'log.txt';               // 불러올 파일명 
$f = fopen( $file, "r" );     // 파일을 열어 '읽기만' 한다. (포인터는 파일의 맨 처음)
$line = fgets( $f, 4096 );  // 한 줄을 읽는다.
echo $line;                      // 한 줄을 출력한다.
fclose($f)                        // 파일을 닫는다.
각 함수의 php.net 매뉴얼 페이지는 아래와 같다.


2. 여러 줄을 불러와야 한다면
한 줄이 아닌, 여러 줄을 불러와야 한다면 while을 사용한다.

$file = 'log.txt';               // 불러올 파일명
$f = fopen( $file, "r" );     // 파일을 열어 '읽기만' 한다. (포인터는 파일의 맨 처음)
while ( ( $line = fgets( $f, 4096 ) ) !== false ) {  // 파일이 끝날 때까지 loop
echo $line,'<br />';       // 한 줄을 출력한다.
}
fclose($f)                     // 파일을 닫는다.

3. 파일 용량이 커서 나누어 읽어야 할 경우
파일 용량이 수십~수백 MB일 경우에
php는 파일을 끝까지 다 읽을 때까지 계속 실행될 수 없다.

따라서, 100줄 또는 1000줄씩 읽어야 한다.
이때 사용되는 함수가 ftell 함수와 fseek 함수다.

ftell: 어느 줄까지 읽었는지(포인터)를 반환
fseek: 어느 줄부터 시작하여 읽을 것인지 포인터 이동

예를 들어, 100줄씩 계속 읽어 나가는 코드는 아래와 같다.

$file = 'log.txt'; // 불러올 파일명
$loop = 100 // 한 번에 읽고 처리할 줄 수
$pointer = false;    // 포인터 변수 초기화
if ( isset($_GET['pointer']) && $_GET['pointer'] > 0 ) { // pointer GET값이 있을 경우
    $pointer = $_GET['pnt'];
}

$f = fopen( $file, "r" );
if ( $pointer ) {
    fseek ( $f, $pointer );
}
$i=1;
while ( ( $line = fgets( $f, 4096 ) ) !== false ) {    // 한 줄 가져오기

    [ $line 변수 가지고 원하는 처리 하기 ]

    if ( $i == $loop ) {
       $pointer_here = ftell($f);    // 현재 포인터 반환
       $url = basename($_SERVER['scRIPT_NAME']).'?pointer='.$pointer_here;    // 현재 실행되는 php 파일에 포인터 값을 파라메터로 추가
       echo '<meta http-equiv="refresh" content="1; url=',$url,'">';    // 처리를 마친 1초 후에 현재 php파일 새로고침, 0으로 해도 무방
        fclose($f);
        exit;
    }
    ++$i;
}

echo '<p>파일 ',$file,' 처리 완료!</p>';
fclose($f);
위 코드는 읽어올 파일이 끝날 때까지 자동으로 새로고침되며
계속 100줄씩 읽으며 원하는 연산처리를 하고
맨 끝에 이르면 "처리 완료!"를 출력하고 마친다.

ftell 함수와 fseek 함수를 활용하여
대용량 파일도 한 번 실행에
끝까지 읽어가며 처리를 할 수 있다.

추천0

비추천 0

댓글목록

등록된 댓글이 없습니다.

전체 82건 3 페이지

이미지 목록

게시물 검색
Copyright © 즐거운 코딩 생활 ( funyphp ). All rights reserved.
PC 버전으로 보기