PHP의 flock() 함수는 파일을 잠그거나(lock) 잠금을 해제(release)하는 데 사용되는 함수입니다. 여러 프로세스나 스크립트가 동시에 같은 파일에 접근할 때 발생할 수 있는 데이터 충돌과 손상을 방지하는 데 필수적인 역할을 합니다. 함수는 성공 시 TRUE를, 실패 시 FALSE를 반환합니다.
문법(Syntax)
flock(file_pointer, operation, block)
매개변수(Parameters)
file_pointer − 잠그거나 잠금을 해제할, 이미 열려 있는 파일의 파일 포인터입니다. fopen() 함수로 생성된 유효한 파일 핸들이어야 합니다.
operation − 사용할 잠금의 종류를 지정합니다.
- LOCK_SH – 공유 잠금(Shared lock): 읽기 작업에 사용됩니다. 여러 프로세스가 동시에 읽을 수 있습니다.
- LOCK_EX – 배타적 잠금(Exclusive lock): 쓰기 작업에 사용됩니다. 한 번에 하나의 프로세스만 접근할 수 있습니다.
- LOCK_UN – 잠금 해제: 공유 잠금이나 배타적 잠금을 해제합니다.
block − 선택적 매개변수로, 잠금이 차단(blocking)되도록 하려면 1로 설정합니다. 기본적으로 flock()은 잠금을 획득할 수 없을 때 대기하지 않고 즉시 FALSE를 반환하지만, 이 값을 설정하면 잠금이 가능할 때까지 기다립니다.
반환값(Return Value)
flock() 함수는 다음과 같은 값을 반환합니다.
- 잠금에 성공하면 TRUE
- 잠금에 실패하면 FALSE
예제(Example)
<?php
$file_pointer = fopen("new.txt","w+");
// 공유 잠금 설정
if (flock($file_pointer,LOCK_SH)) {
fwrite($file_pointer,"Some content");
flock($file_pointer,LOCK_UN);
} else {
echo "파일 잠금 중 오류가 발생했습니다!";
}
fclose($file_pointer);
?>위 예제에서는 먼저 fopen()으로 파일을 열고, flock()으로 공유 잠금(LOCK_SH)을 설정한 뒤 파일에 내용을 기록합니다. 작업이 완료되면 LOCK_UN으로 잠금을 해제하고, 마지막으로 fclose()로 파일을 닫습니다. 만약 잠금 설정에 실패하면 오류 메시지를 출력합니다.
출력(Output)
TRUE
참고 사항
flock()은 파일 핸들이 닫히거나 스크립트가 종료되면 자동으로 잠금이 해제됩니다. 또한 Windows 환경에서는 flock()이 항상 강제로 적용되므로, 이식성을 고려한 코드 작성 시 이 점을 유의해야 합니다. 동시성 제어가 중요한 로그 파일, 카운터 파일 등을 다룰 때 flock()을 활용하면 데이터 무결성을 효과적으로 보호할 수 있습니다.