본문 바로가기

프로그래밍 공부/PHP

PHP - 날짜/시간 그리고 파일 조작

날짜/시간

오늘 날짜나 현재 시각을 표시하는 방법과 HTML 폼에서 송신된 날짜의 타당성을 검사하는 함수를 공부한다.

UNIX 타임스탬프 표시하기

time 함수를 실행하면 UNIX의 타임스탬프(초)를 가져올 수 있다.

1
2
3
4
<?php
    $now = time();
    print $now;
?>
cs

UNIX 타임스탬프는 JavaScript에서도 사용하는 것인데, UNIX epoch라고도 부르며 1970년 1월 1일부터 누적된 시간(초)를 의미한다.

날짜에서 UNIX 타임스탬프 가져오기

날짜(문자열)에서 UNIX 타임스탬프를 구하려면 mktime 함수를 사용한다.

1
2
3
4
<?php
    $timestamp = mktime(0,0,0,1,23,2020);
    print $timestamp;
?>
cs

mktime 함수는 인수로 '시간, 분, 초, 월, 일, 년'을 받는다.

UNIX 타임스탬프를 날짜로 가져오기

date 함수를 사용하면 UNIX 타임스탬프를 날짜로 돌려받을 수 있다. time 함수나 mktime 함수 등과 함께 사용하면 며칠 후나 며칠 전의 날짜를 가져올 수 있다.

1
2
3
4
5
<?php
    $timestamp = time() + (60*60*24)*7;
    $next_week = date('Y년m월d일 H시i분s초',$timestamp);
    print $next_week;
?>
cs

위의 코드는 time 함수로 가져온 타임스탬프에 일주일 분의 초를 더하여 일주일 후의 타임스탬프를 작성한다. 그리고 date 함수에 날짜 포맷용 기호 'Y년m월d일 H시i분s초'와 timestamp를 지정하고 실행하면 $next_week에서 일주일 후의 날짜를 가져온다. 만약 UNIX 타임스탬프를 지정하지 않으면 실행 시점의 타임스탬프를 사용하게 된다.

기호 내용
Y 네 자리 연도
m 두 자리 월(앞에 0이 붙음)
D 두 자리 일(앞에 0이 붙음)
H 두 자리 시(24시간 방식)
i 두 자리 분(앞에 0이 붙음)
s 두 자리 초(앞에 0이 붙음)

위의 표는 날짜 포맷용 기호를 보여주는 표이다.

날짜 검사

웹에서 회원 등록 시에 생년월일을 입력받는 경우 가입자가 2월 31일과 같이 존재하지 않는 날짜를 입력할 수도 있어 날짜의 타당성을 검사할 필요가 있다. 이 경우에는 checkdate 함수를 이용한다.

1
2
3
4
5
6
7
8
9
<?php
    $month = 1;
    $day = 23;
    $year = 2020;
 
    if(!checkdate($month,$day,$year)){
        print "올바른 날짜를 입력하세요.";
    }
?>
cs

파일 조작

데이터베이스를 이용하지 않는 환경에서는 데이터를 파일에 저장해야 한다. 파일과 디렉터리를 조작하는 함수에 대해 공부한다.

파일 읽고 쓰기

file_get_contents 함수는 파일을 읽어 들여 파일 내용을 문자열로 리턴해준다. 파일명뿐만 아니라 URL을 인수로 지정하여 파일의 내용을 가져올 수도 있다. file 함수는 읽어 들인 파일의 내용을 한 행씩 '배열'로 가져오려고 할 때 사용한다. 사용방법은 file_get_contents와 같다.

파일에 데이터를 쓸 때는 file_put_contents 함수를 사용, fopen, fwrite, fclose의 기능이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    // 파일 데이터 읽기
    $filename = "test.txt";
    if(is_readable($filename)){
        $contents = file_get_contents($filename);
        print $contents;
    }else{
        print $filename."는 읽어 들일 수 없습니다.";
    }
 
    // 파일 데이터 쓰기
    $filename = "test.txt";
    $contents = "abcdefghijklmn";
    file_put_contents($filename,$contents);
    print "기록하였습니다.";
?>
cs

file_get_contents 함수를 실행하기 전 'test.txt'의 텍스트 파일을 예시로 생성해준다. 이 텍스트 파일을 $filename 변수에 넣어준다. if 조건문의 is_readable 함수를 사용해 인수로 지정한 파일명으로 파일을 읽어 들일 수 있는지 검사하고, 읽어 들이면 조건식은 TRUE가 되고 file_get_contents 함수를 실행해 $contents에 내용을 할당하고 출력시킨다.

file_put_contents 함수에 경우 $filename에 파일명을 $contents에 파일의 내용을 넣고 file_put_contents 함수에 지정하여 파일을 쓰게 된다. 파일이 없다면 새로 만들고 같은 이름의 파일이 있으면 덮어 쓰게 된다. 

추가로 Windows에서는 문제가 없지만 Mac이나 Linux에서 웹 서버파일을 수정하거나 삭제할 때에 권한이 적절하게 설정되어 있지 않으면 'Permission denied'라는 오류를 출력한다. 이 경우 사용자에게 쓰기 권한을 추가해야 한다.

fopen, fread, fwrite, fclose 함수는 텍스트 파일을 프로그램에서 읽어들이는 방법중 하나이다. file_get_contents나 file_put_contents의 차이점은 파일 포인터를 이용하는 점과 동영상 파일 등 바이너리 파일을 취급할 수 있다는 점이다.

함수 이름 설명
fopen 파일 오픈 시의 상태를 옵션으로 지정하여 파일 포인터를 열기
fread 파일 포인터 옵션중 '읽기 전용'
fwrite 파일 포인터 옵션중 '쓰기 전용'
fclose 파일 포인터를 닫기

파일 삭제하기, 복사하기

파일을 삭제 하려면 unlink 함수를 사용한다.

파일을 복사 하려면 copy 함수를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    // 파일 삭제하기
    $filename = "test.txt";
    if(is_file($filename&& unlink($filename)){
        print $filename."을(를) 삭제하였습니다.";
    }else{
        print $filename."은(는) 삭제할 수 없습니다.";
    }
 
    // 파일 복사하기
    if(copy("test.txt","test.bak")){
        print "복사에 성공하였습니다.";
    }else{
        print "복사할 수 없습니다.";
    }
?>
cs

unlink 함수에 파일명을 지정하고 실행하면 파일이 삭제되고 정상적으로 삭제가 되면 TRUE를 리턴한다. if 조건문 안에 is_file 함수로 파일의 존재 유무를 확인한다. Mac이나 Linux에 경우는 파일을 삭제하려면 파일과 디렉터리에 적절한 권한을 설정해야 한다.

copy 함수는 unlink 함수와 마찬가지로 복사에 성공하면 TRUE를 실패하면 FALSE를 리턴한다. 역시 Mac이나 Linux에서는 파일과 디렉터리에 적절한 권한을 설정할 필요가 있다.

디렉터리 작성하기, 삭제하기

디렉터리를 작성하려면 mkdir 함수를 사용한다.

디렉터리를 삭제하려면 rmdir 함수를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    // 디렉터리 작성하기
    $dirname = "temp";
    if(!is_dir($dirname&& mkdir($dirname)){
        print $dirname."을(를) 만들었습니다.";
    }else{
        print $dirname."은(는) 만들 수 없습니다.";
    }
 
    // 디렉터리 삭제하기
    rmdir("temp");
?>
cs

mkdir 함수는 작성이 성공하면 TRUE를 실패하면 FALSE를 리턴한다. 결과는 $변수에 넣을 수 있다. 인수로 경로명과 모드를 지정할 수 있지만 이 모드는 디렉터리 권한으로 모드를 생략하면 '0777'이라는 모든 권한을 가질 수 있는 권한으로 설정이 된다. is_dir 함수는 지정된 경로명이 디렉터리로 존재하는 경우 TRUE를 리턴한다. 디렉터리가 존재하지 않는다면 TRUE가 되도록 !를 사용해 반환값을 반전시킨다. Mac과 Linux에서는 적절한 권한을 설정해야 한다.

redir 함수를 사용할 때는 디렉터리 안에 파일과 같은 데이터가 하나도 없는 빈 상태에서 인수에 디렉터리명을 지정한다. 역시 Mac과 Linux에서는 적절한 권한을 설정해야 한다.

pathinfo 함수를 사용하면 경로명에서 디렉터리명이나 파일명 확장자를 가져올수 있다. pathinfo 함수에 경로명을 지정하면 연관 배열로 값을 리턴한다. 키 'dirname'에는 디렉터리명, 키 'basename'에는 파일명 그리고 키 'extention'에는 확장자가 할당이 된다. _FILE_은 실행 중인 파일명이 된다.

날짜/시간 그리고 파일 조작 함수 정리

함수 이름 함수 형태 함수 설명
time $변수 = time(); UNIX 타임스탬프를 가져오기
mktime $변수 = mktime(시간,분,초,월,일,연); 날짜에서 UNIX 타임스탬프 구하기
date $변수 = date(날짜포맷,UNIX 타임스탬프); UNIX 타임스탬프를 날짜로 리턴
checkdate $변수 = checkdate(월,일,연); 날짜 타당성 검사
file_get_contents $변수 = file_get_contents("파일명 또는 URL"); 파일 읽어 들이기
is_readable is_readable($변수); 읽을 수 있는지 검사
file $변수 = file("파일명 또는 URL"); 읽을 파일을 한 행씩 배열로 가져오기
file_put_contents file_put_contents("파일명",$변수); 파일에 데이터 쓰기
mb_convert_encoding $변수 = mb_convert_encoding("변수","언어","언어"); 문자 코드 변환하기
fopen $파일포인터 = fopen("파일명 또는 URL","옵션"); 오픈 시 상태를 옵션으로 지정
fread fread("$파일포인터","읽어 들일 데이터"); 읽기 전용
fwrite fwrite("$파일포인터","읽어 들일 데이터"); 쓰기 전용
fclose fclose($파일포인터); 파일 포인터를 닫기
unlink $변수 = unlink("파일명"); 파일 삭제하기
is_file is_file($변수); 파일이 존재하는지 검사
copy copy(원본 파일,대상 파일); 파일 복사하기
mkdir $변수 = mkdir("경로명",모드); 디렉터리 작성하기
is_dir is_dir($변수); 디렉터리가 존재하는지 검사
rmdir rmdir(디렉터리명); 디렉터리 삭제하기
pathinfo $변수 = pathinfo(_FILE_); 경로에 대한 정보 가져오기
  print $변수['dirname']; 디렉터리명
  print $변수['basename']; 파일명
  print $변수['extension']; 확장자