본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP unlink() — 파일 삭제 · is_file 체크 · 임시파일 처리 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP 파일 시스템 함수

PHP unlink() — 파일을 삭제하는 함수

is_file 사전 체크 · 반환값 · 임시 파일 처리 · 보안 주의 완전 정리
시작 오늘 분석할 코드

unlink()는 파일을 삭제하는 함수입니다. 이름이 직관적이지 않아 처음에는 낯설 수 있지만, Unix 시스템에서 파일 연결(link)을 끊는 개념에서 온 이름입니다. 삭제 전 is_file()로 파일 존재를 확인하는 패턴이 권장됩니다.

<?php $filename = "test.txt"; if (is_file($filename) && unlink($filename)) { // is_file()로 존재 + 일반 파일 확인 후 // unlink()로 삭제 시도 — 성공하면 true print $filename . "을 삭제했습니다."; } else { print $filename . "을 삭제할 수 없습니다."; } ?>
실제 출력 미리보기
파일이 있고 삭제 성공
test.txt을 삭제했습니다.
파일 없음 또는 권한 없음
test.txt을 삭제할 수 없습니다.
용어 용어 정리
unlink()파일 삭제 함수. 성공 true / 실패 false 반환. 디렉토리는 삭제 불가
is_file()경로가 일반 파일인지 확인. 디렉토리나 존재하지 않으면 false
file_exists()파일 또는 디렉토리 존재 여부 확인. 읽기 권한 체크 안 함
퍼미션파일의 쓰기 권한 또는 상위 디렉토리 쓰기 권한 필요
임시 파일파일 업로드 처리 후, 썸네일 생성 후 임시 파일 unlink로 정리
unlink 이름 유래Unix에서 파일은 링크(link). unlink = 링크 제거 = 파일 삭제
rmdir()빈 디렉토리 삭제 함수 — unlink는 파일만, rmdir는 폴더만
보안사용자 입력값으로 경로 구성 시 경로 순회 공격(../) 주의

1 is_file() vs file_exists() — 어느 것으로 체크?
is_file은 "일반 파일"만 true — 디렉토리 실수 방지

is_file()은 경로가 일반 파일(디렉토리·심볼릭 링크 등 제외)일 때만 true를 반환합니다. file_exists()는 파일과 디렉토리 모두 true를 반환하므로, unlink 전 체크로는 is_file()이 더 적합합니다.

// is_file() — 일반 파일만 확인 (권장) if (is_file("test.txt")) { unlink("test.txt"); } // file_exists() — 파일·디렉토리 모두 true if (file_exists("somepath")) { unlink("somepath"); // 디렉토리면 실패 + 경고 }
※ unlink()는 파일만 삭제합니다. 디렉토리를 삭제하려면 rmdir()(빈 폴더) 또는 재귀 삭제 함수를 사용해야 합니다.

2 업로드 파일 삭제 패턴
게시글 삭제 시 첨부파일도 함께 삭제
// 게시글 삭제 시 첨부 이미지도 삭제 $post_id = (int) $_GET['id']; $img_path = "uploads/" . $post_id . ".jpg"; if (is_file($img_path) && unlink($img_path)) { echo "이미지 삭제 완료"; } // DB에서 게시글 삭제 // $pdo->exec("DELETE FROM posts WHERE id=$post_id");
⚠️ 사용자 입력($post_id 등)으로 파일 경로를 구성할 때는 반드시 숫자 검증·화이트리스트 등 경로를 제한하세요. "../../../etc/passwd" 같은 경로 순회 공격에 취약해질 수 있습니다.

3 임시 파일 처리 패턴
이미지 리사이즈 후 원본 임시 파일 정리
// 파일 업로드 → 처리 → 임시파일 삭제 $tmp = $_FILES['photo']['tmp_name']; $target = "uploads/photo_processed.jpg"; // 이미지 처리 (리사이즈 등) // ... imagecreatefrom, imagejpeg 처리 ... // 처리 완료 후 임시 파일 삭제 (보통 PHP가 자동 삭제하지만 명시 가능) if (is_file($tmp)) { unlink($tmp); }

 

반응형

 

4 glob으로 여러 파일 일괄 삭제
패턴 매칭으로 여러 파일 한 번에 정리
// 7일 이상 된 로그 파일 삭제 $cutoff = time() - (7 * 86400); foreach (glob("logs/*.log") as $file) { if (filemtime($file) < $cutoff) { unlink($file); echo "삭제: {$file}\n"; } }

5 반환값 활용 — 삭제 성공 여부 확인
$result = unlink("test.txt"); if ($result) { echo "삭제 성공"; } else { echo "삭제 실패 (파일 없음 또는 권한 오류)"; // error_get_last()로 오류 상세 확인 가능 }

6 자주 하는 실수
실수 증상 해결
사전 확인 없이 unlink 호출 파일 없으면 E_WARNING + false 반환 is_file() 확인 후 unlink()
디렉토리에 unlink 사용 false 반환, 삭제 안 됨 디렉토리는 rmdir() 사용
사용자 입력으로 경로 구성 경로 순회 공격(../../../) 가능 basename()으로 경로 분리, 화이트리스트 검증
권한 문제 무시 쓰기 권한 없는 파일은 삭제 불가 퍼미션 확인, 웹 서버 사용자 권한 체크
삭제 후 캐시 없애기 안 함 clearstatcache() 없으면 is_file이 캐시된 결과 반환 unlink 후 clearstatcache() 호출 권장

핵심 한 줄 요약

unlink($path)파일 삭제 함수 — 성공 true, 실패 false
is_file 패턴if (is_file($f) && unlink($f)) — 안전한 삭제 패턴
is_file vs file_existsunlink 전 체크는 is_file() — 일반 파일만 true
디렉토리unlink는 파일만 — 디렉토리 삭제는 rmdir()
보안사용자 입력으로 경로 구성 시 경로 순회 공격 방어 필수

Tags

#PHP #unlink #파일삭제 #is_file #file_exists #임시파일삭제 #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, unlink, 파일삭제, is_file, file_exists, 임시파일삭제, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형

댓글