[ php ] fopen, fgets, fclose, fseek, ftell
페이지 정보
작성자 웹지기 댓글 0건 조회 6,487회 작성일 18-09-30 18:05본문
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 ) { // 파일이 끝날 때까지 loopecho $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
댓글목록
등록된 댓글이 없습니다.