메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

PHP에서 파일작업 하기

한빛미디어

|

2002-11-06

|

by HANBIT

13,690

저자: 존 코겐셀(John Coggeshall)

지난 칼럼에서는 PHP에서 레퍼런스를 적절하게 사용하여 효율적으로 작동하는 코드에 대해 알아보았었다. 본 기사에서는 완전히 주제를 바꾸어 PHP 함수를 사용해서 파일 시스템과 작업하는 것에 대해 알아보려고 한다. 대부분의 언어에서 파일을 읽고 쓰는 작업은 파일에 대한 스트림을 열고, 파일을 읽거나 쓰고, 스트림을 닫는 과정이라고 할 수 있다. 스트림을 열면 그 스트림을 가리키는 정수, 즉 스트림 식별자(파일 핸들)를 얻게 된다. 파일에 뭔가를 쓰거나 파일로부터 뭔가를 읽을 때는 그 식별자를 이용해서 작업하고자 하는 파일이 어떤 것인지를 지정한다. PHP는 파일 핸들을 이용해서 해당 파일 작업에 필요한 정보를 찾아낸다.

이 기사에서는 우선 텍스트 파일들을 읽고 쓰는 것과 같은 기본을 다루고 난 후, 단축 기능과 같은 고급 기능들을 다루어 볼 것이다. 그럼 이제부터 시작해보자.

파일 입출력

파일 열기와 닫기

PHP 개발자가 사용하는 대부분의 파일 IO(입력과 출력) 함수는 fopen() 명령어이다. 이 함수는 파일 조작에 있어 가장 일반적인 시작점이며 대부분의 PHP 스크립트에서 사용된다. fopen() 명령어 문법은 아래와 같다.
fopen(string filename, string mode [, int use_include_path])
fopen() 함수는 호출될 때 file refrenece(또는 포인터)라는 정수를 리턴하며, 연산이 실패하면 0(제로)을 리턴한다. 대부분의 경우에 정수값은 변수로 저장되어야 하는데, 이는 PHP에서 사용하는 대다수의 파일 입출력 함수가 호출될 때 변수를 파라미터로 요구하기 때문이다. fopen() 함수는 두 개의 파라미터와 하나의 선택가능한 파라미터를 필요로 한다. 첫 번째 파라미터는 filename으로 파일시스템에서 엑세스할 파일 이름이다. 이 파일은 실제로 존재할 수도 없을 수도 있다. 두 번째 파라미터는 mode로써 파일을 어떤 식으로 엑세스할 것인지 결정한다. PHP에서 사용할 수 있는 엑세스 모드는 아래 테이블에 목록화되어 있다.

스트링 엑세스 모드
r 읽기 전용 파일 엑세스, 파일의 처음부터 엑세스 시작
r+ 읽기와 쓰기 모두 가능한 파일 엑세스, 파일의 처음부터 엑세스 시작
w 파일이 있는 경우, 쓰기 전용으로 파일 엑세스, 모든 내용은 삭제한다. 파일이 없는 경우 파일을 생성한다. 두 경우 모두 파일의 처음부터 엑세스 시작
w+ 읽기와 쓰기로 파일 엑세스를 하되 파일이 있을 경우 모든 내용 삭제한다. 파일이 없으면 파일을 생성한다. 두 경우 모두 파일의 처음부터 엑세스 시작
a 읽기 전용으로만 파일을 오픈한다. 파일이 없으면 파일을 생성한다. 그리고 만약 파일이 존재하면 파일의 끝에서부터 엑세스 시작하되 내용은 삭제하지 않는다.
a+ 읽기와 쓰기로 파일 오픈. 파일이 없으면 파일을 생성한다. 만약 파일이 존재하면 파일 끝에서부터 엑세스 시작(단, 내용은 삭제하지 않는다).

위의 테이블에서 보듯이 이러한 모드는 크게 읽기, 쓰기, 추가라는 세 개의 그룹으로 나눌 수 있으며 단지 하나의 문자만 fopen() 명령어의 mode 파라미터로 사용될 수 있다.

마지막으로 선택적 파라미터 user_include_path는 불린 값을 표현하는 정수이다. 이 파라미터 값이 참(true, 정수값 1)이면 지정된 디렉토리에 존재하지 않는 파일을 열 경우, PHP의 include path에 지정된 디렉토리에서 파일을 찾는다(† 역자 주: user_include_path가 지정되고, 참이면 fopen()는 현재 include path에서 파일을 찾는다. 그러나 파일을 여는데 실패할 경우에는 false가 리턴된다).

중요: 파일을 엑세스하거나 생성하기 위해서 디렉토리(또는 파일)는 적절한 퍼미션을 가지고 있어야 한다. 또한 PHP 스크립트를 실행하는 사용자에게 엑세스를 허락해야 한다(대개 웹 서버의 사용자이름과 동일).

파일 레퍼런스가 생성되고 오픈된 파일에 읽기와 쓰기가 실행되면 파일이 다시 오픈되기 전에 닫아야 한다. 모든 파일 레퍼런스는 PHP 스크립트가 종료되면 자동으로 닫히지만, 손수 파일을 닫는 습관을 들이는 것이 좋은 프로그래밍 습관이라 할 수 있다. 파일을 닫기 위해 PHP는 fclose() 함수를 제공한다. 이 함수는 하나의 파라미터(file reference)를 취하며 성공 또는 실패를 나타내는 불린값을 리턴한다.

아래의 코드는 a+(추가 읽기/쓰기) 모드를 사용하여 /tmp/ 디렉토리에 있는 test.txt라는 파일을 열고, 닫는 동작을 실행하는 예제이다.

문자열 읽고 쓰기

지금까지 파일을 여는 방법에 대해 이야기를 했다. 그러면 이제부터는 파일에서 데이터를 읽는 방법을 알아보자. 많은 방법이 있지만 가장 기본적인 방법은 fgets() 함수를 사용하는 것이다. fgets() 함수의 문법은 아래와 같다.
fgets(int file reference [, int length])
위에서 보는 것처럼 fgets() 함수로 요구되는 유일한 파라미터는 fopen() 함수가 반환하는 file reference이다. 선택적 파라미터는 파일로부터 읽어들이는 바이트 수(1을 뺀)를 나타낸다. 만약 이 파라미터가 없을 경우, fgets()은 뉴 라인 캐릭터가 읽혀지거나 함수가 파일 끝(EOF)에 도달할 때까지 파일로부터 1킬로바이트를 읽어들일 것이다. fgets() 함수로부터 온 리턴값은 파일로부터 읽혀들여져온 문자열이다. 뉴 라인 캐릭터와 만나서 fgets() 함수가 읽기를 멈추면 뉴 라인 캐릭터가 문자열의 일부로 반환된다는 사실을 기억해두기 바란다. 그렇지만 이는 파일 끝에 도달하면 거짓이 된다. 그런 경우, 파일 끝 문자는 결과 문자열에서 생략된다.

fgets() 함수와 반대되는 fputs()는 파일에 문자열을 쓰는데 사용되는 함수이다. fgets()와 달리 fputs()는 최소 두개의 파라미터(파일 레퍼런스와 파일에 작성할 문자열)와 파일에 쓸 문자열의 크기를 나타내는 선택적 옵션을 필요로 한다.

이제까지 PHP에서 파일을 열고, 닫고, 쓰는 방법을 알아보았다. 그러면 이제부터는 간단한 카운터 스크립트를 만들어 보자. 이는 스크립트가 실행된 수를 카운트 하는 간단한 프로그램이다. 웹 페이지의 경우 이 스크립트는 페이지 뷰를 기록하는데 사용될 수 있다. 이 스크립트를 생성하기 위해서는 페이지가 엑세스된 수를 파일에 저장하고, 매번 스크립트가 실행될 때마다 파일에서 값을 읽고, 1을 더하고, 다시 파일에 작성하면 된다.

그럼 시작해 보자.

일단은 파일을 열어야 한다. /tmp/ 디렉토리 안의 counter.txt 파일을 사용할 것이다.

스크립트가 처음 실행되기 때문에 파일이 존재하지 않는다.  먼저 fopen() 명령어가 성공했는지 보기위해 파일 레퍼런스를 테스트 해야 한다. 파일을 생성할 필요가 없다면 방문자수 합계를 1로 설정하고 파일에 값을 기록하도록 하자.
   if(!$fr) {
      $visitors = 1;		// 첫번째 visitor
      $fr = fopen("/tmp/counter.txt","w");
      if(!$fr) {
         echo "Could not create the counter file!";
         exit;
      }
      fputs($fr, $visitors);
fclose($fr);
만약 counter.txt 파일을 여는데 성공했다면, 다음에 해야 할 단계는 파일로부터 방문자수 합계를 포함하는 문자를 읽어 1을 더하고 사용자에게 출력하는 일이다.
   } else {
      $visitors = fgets($fr);

      $visitors++;
      echo "You are visitor number: $visitors";
이제 현재의 파일 레퍼런스를 닫고, 쓰기 모드에서 파일을 다시 연다. 일단 파일이 다시 열리면 새로운 방문자수 합계를 파일에 작성하고, 파일을 닫으면 된다. 이것으로 끝이다. 장말 쉽지 않은가?
      fclose($fr);
      $fr = fopen("/tmp/counter.txt","w");
      if(!$fr) {
         echo "Could not re-create the counter file!";
         exit;
      }
      fputs($fr, $visitors);
      fclose($fr);
   }
?>
오늘은 이것만

이상으로 PHP로 파일시스템에 엑세스하는 방법에 대한 설명을 마치겠다. 이제 파일에 엑세스할 때 사용되는 몇 가지 기본 함수들에 꽤 친숙해졌을 것이라 생각된다.
존 코겐셀(John Coggeshall)은 10년이 넘게 개발을 해왔으며 PHP로는 5년 정도의 개발 경력을 가진 사설 웹 컨설턴트, 그래픽 디자이너이다.
TAG :
댓글 입력
자료실

최근 본 상품0