flock 함수
(PHP 4, PHP 5, PHP 7, PHP 8)
flock — 휴대용 자문 파일 잠금
설명
flock(resource $stream
, int $operation
, int &$would_block
= null): bool
flock()를 사용하면 거의 모든 플랫폼(대부분의 Unix 파생 제품 및 Windows 포함)에서 사용할 수 있는 간단한 판독기/작성기 모델을 수행할 수 있습니다.
잠금은 fclose()에 의해서도 해제되거나 stream
이 가비지 수집될 때 해제됩니다.
PHP는 권고 방식으로 완전한 파일을 잠그는 이식 가능한 방법을 지원합니다(즉, 액세스하는 모든 프로그램이 동일한 잠금 방식을 사용해야 하며 그렇지 않으면 작동하지 않습니다). 기본적으로 이 함수는 요청된 잠금을 획득할 때까지 차단됩니다. 이것은 아래에 설명된 LOCK_NB 옵션으로 제어할 수 있습니다.
매개변수
stream
- 일반적으로 fopen()을 사용하여 생성되는 파일 시스템 포인터 리소스입니다.
operation
- 작업은 다음 중 하나입니다.
- LOCK_SH 공유 잠금(판독기)을 획득합니다.
- LOCK_EX는 배타적 잠금(writer)을 획득합니다.
- LOCK_UN 잠금을 해제합니다(공유 또는 독점).
잠금 시도 중에 flock()이 차단되지 않아야 하는 경우 위 작업 중 하나에 LOCK_NB를 비트 마스크로 추가할 수도 있습니다.
would_block
- 잠금이 차단되면 선택적 세 번째 인수는 1로 설정됩니다(EWOULDBLOCK errno 조건).
반환 값
성공하면 true
를, 실패하면 false
를 반환합니다.
Examples
예제 #1 flock() 예제
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
예제 #2 LOCK_NB 옵션을 사용하는 flock()
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Activate the LOCK_NB option on an LOCK_EX operation */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Unable to obtain lock';
exit(-1);
}
/* ... */
fclose($fp);
?>
메모
메모:
flock()는 Windows에서 권고 잠금 대신 필수 잠금을 사용합니다. 필수 잠금은 fcntl() 시스템 호출이 지원하는 일반적인 메커니즘을 통해 Linux 및 System V 기반 운영 체제에서도 지원됩니다. 즉, 해당 파일에 setgid 권한 비트가 설정되고 그룹 실행 비트가 지워진 경우입니다. Linux에서 이것이 작동하려면 파일 시스템을 mand 옵션으로 마운트해야 합니다.
메모: Flock()은 파일 포인터를 필요로 하기 때문에 쓰기 모드(fopen()에 "w" 또는 "w+" 인수로 파일을 열어 자르려는 파일에 대한 액세스를 보호하기 위해 특수 잠금 파일을 사용해야 할 수도 있습니다. ).
메모: 로컬 파일에 대해 fopen()이 반환한 파일 포인터 또는 streamWrapper::stream_lock() 메서드를 구현하는 사용자 공간 스트림을 가리키는 파일 포인터에만 사용할 수 있습니다.
경고 후속 코드에서 스트림 인수에 다른 값을 할당하면 잠금이 해제됩니다.
경고
일부 운영 체제에서 flock()는 프로세스 수준에서 구현됩니다. 다중 스레드 서버 API를 사용할 때 동일한 서버 인스턴스의 병렬 스레드에서 실행되는 다른 PHP 스크립트로부터 파일을 보호하기 위해 Flock()에 의존하지 못할 수도 있습니다!
Flock()은 FAT 및 그 파생물과 같은 구식 파일 시스템에서 지원되지 않으므로 이러한 환경에서는 항상 false
를 반환합니다.
메모: Windows에서 잠금 프로세스가 파일을 두 번째로 열면 파일의 잠금을 해제할 때까지 이 두 번째 핸들을 통해 파일에 액세스할 수 없습니다.