본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP file_put_contents() — 파일 쓰기 · FILE_APPEND · LOCK_EX 완전 정리

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

 

 

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);

세밀한 제어 가능
이진 파일, 부분 쓰기 유리
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학습, 웹개발, 티스토리
반응형

댓글