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에서 잠금 프로세스가 파일을 두 번째로 열면 파일의 잠금을 해제할 때까지 이 두 번째 핸들을 통해 파일에 액세스할 수 없습니다.