반응형
Web Development · PHP 파일 입출력 함수
PHP file_put_contents() — 파일에 내용을 쓰는 가장 간단한 함수
FILE_APPEND 추가 모드 · LOCK_EX 잠금 · fopen/fwrite 비교 완전 정리
시작 오늘 분석할 코드
file_put_contents()는 파일에 내용을 쓰는 함수입니다. fopen → fwrite → fclose의 3단계 과정을 한 줄로 처리합니다. 파일이 없으면 자동으로 생성하고, 있으면 기존 내용을 덮어씁니다. 세 번째 인수로 FILE_APPEND 플래그를 넣으면 기존 내용 뒤에 추가합니다.
<?php $filename = "test.txt"; $contents = "abcdefghijklmn"; file_put_contents($filename, $contents); // test.txt 파일에 "abcdefghijklmn" 을 씀 // 파일 없으면 생성, 있으면 덮어씀 print "기록 완료"; ?>
실제 출력 미리보기
$contents
abcdefghijklmn
→
test.txt
abcdefghijklmn
용어 용어 정리
file_put_contents()file_put_contents($path, $data, $flags) — 파일에 데이터 쓰기
반환값쓴 바이트 수(정수) 반환. 실패 시 false
FILE_APPEND세 번째 인수 플래그. 기존 파일 끝에 추가(덮어쓰지 않음)
LOCK_EX쓰기 중 파일 잠금 — 동시 접근으로 인한 데이터 손상 방지
덮어쓰기기본 동작. 파일이 있으면 내용을 전부 지우고 새로 씀
파일 자동 생성대상 파일이 없으면 자동으로 생성. 디렉토리는 자동 생성 안 함
fopen/fwrite저수준 파일 핸들 방식. 부분 쓰기, 이진 파일, 세밀한 제어에 유리
퍼미션쓰기 권한이 없는 디렉토리에는 실패. 웹 서버 사용자 권한 확인 필요
1 반환값 활용 — 성공/실패 확인
쓴 바이트 수 반환 — 0도 성공, false가 실패
file_put_contents()는 성공하면 쓴 바이트 수를 반환합니다. 빈 문자열을 쓰면 0이 반환되므로, 실패를 판단하려면 === false로 엄격 비교해야 합니다.
$bytes = file_put_contents("test.txt", "abcdefghijklmn"); if ($bytes === false) { echo "쓰기 실패"; } else { echo $bytes . "바이트 기록됨"; // 14바이트 기록됨 }
2 FILE_APPEND — 기존 내용에 추가
로그 파일처럼 내용을 쌓을 때 필수
기본은 덮어쓰기입니다. 로그처럼 기존 내용을 유지하면서 뒤에 덧붙이려면 FILE_APPEND 플래그를 세 번째 인수로 넣습니다.
// 기본 동작 — 덮어쓰기 file_put_contents("log.txt", "첫 번째 줄\n"); file_put_contents("log.txt", "두 번째 줄\n"); // log.txt: "두 번째 줄" 만 남음 (첫 줄 덮어써짐) // FILE_APPEND — 추가 모드 file_put_contents("log.txt", "첫 번째 줄\n"); file_put_contents("log.txt", "두 번째 줄\n", FILE_APPEND); // log.txt: "첫 번째 줄\n두 번째 줄\n" (두 줄 모두 유지)
※ 날짜별 로그 파일에 FILE_APPEND와 LOCK_EX를 함께 사용하는 것이 안전한 로깅 패턴입니다.
3 LOCK_EX — 동시 쓰기 충돌 방지
트래픽이 있는 서비스에서 로그 손상 방지
// FILE_APPEND + LOCK_EX 조합 (안전한 로그 추가) $log_line = date('Y-m-d H:i:s') . " - 접속 로그\n"; file_put_contents( "access.log", $log_line, FILE_APPEND | LOCK_EX // | 비트 OR로 두 플래그 동시 적용 );
반응형
4 fopen/fwrite vs file_put_contents
fopen/fwrite/fclose — 저수준
$fp = fopen('file.txt', 'w');
fwrite($fp, "내용");
fclose($fp);
세밀한 제어 가능
이진 파일, 부분 쓰기 유리
fwrite($fp, "내용");
fclose($fp);
세밀한 제어 가능
이진 파일, 부분 쓰기 유리
file_put_contents — 고수준
file_put_contents('file.txt', "내용");
한 줄로 처리
일반적인 쓰기에 충분
한 줄로 처리
일반적인 쓰기에 충분
5 실전 패턴 — 방문자 로그 기록
date_default_timezone_set('Asia/Seoul'); $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $ua = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'; $log = sprintf("%s | %s | %s\n", date('Y-m-d H:i:s'), $ip, $ua); file_put_contents( 'visits_' . date('Ymd') . '.log', $log, FILE_APPEND | LOCK_EX );
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| FILE_APPEND 없이 로그 반복 저장 | 매번 기존 로그가 지워짐 | 추가 모드: file_put_contents($f, $data, FILE_APPEND) |
| 디렉토리 없이 경로 지정 | Warning: failed to open stream: No such file or directory | mkdir로 먼저 디렉토리 생성 후 파일 쓰기 |
| 반환값 false를 0으로 오인 | 빈 파일 쓰기 성공(0바이트)을 실패로 판단 | === false 엄격 비교 사용 |
| 웹 서버 쓰기 권한 미확인 | Permission denied 오류 | 디렉토리 권한 755/퍼미션 체크, 또는 chmod 적용 |
| LOCK_EX 없는 동시 쓰기 | 다중 요청에서 로그 내용 섞임, 데이터 손상 | FILE_APPEND | LOCK_EX 함께 사용 |
핵심 한 줄 요약
file_put_contents($f, $d)파일에 내용 쓰기 — 없으면 생성, 있으면 덮어씀
반환값쓴 바이트 수 반환, 실패 시 false — === false 로 판별
FILE_APPEND세 번째 인수 — 기존 파일 끝에 추가(로그에 필수)
LOCK_EX동시 쓰기 잠금 — FILE_APPEND | LOCK_EX 조합이 안전
주의디렉토리 없으면 실패 / 웹 서버 쓰기 권한 확인 필요
Tags
#PHP #file_put_contents #파일쓰기 #FILE_APPEND #LOCK_EX #파일입출력 #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, file_put_contents, 파일쓰기, FILE_APPEND, LOCK_EX, 파일입출력, 파일생성, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP unlink() — 파일 삭제 · is_file 체크 · 임시파일 처리 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP copy() — 파일 복사 · 백업 패턴 · rename과 차이 완전 정리 (0) | 2026.07.11 |
| PHP file_get_contents() — 파일 전체 읽기 · URL 읽기 · is_readable 완전 정리 (0) | 2026.07.11 |
| PHP date() — 타임스탬프를 날짜 문자열로 포맷 · 포맷 문자 표 완전 정리 (0) | 2026.07.11 |
| PHP mktime() — 특정 날짜의 타임스탬프 생성 · date 연계 · 날짜 계산 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글