>php教程 >php手册 >PHP 무리 파일 lock_php 기본 사항에 대한 자세한 소개

PHP 무리 파일 lock_php 기본 사항에 대한 자세한 소개

WBOY
WBOY원래의
2016-05-16 09:00:162395검색

Flock
(PHP 4, PHP 5)

flock — 경량 권고 파일 잠금

설명
bool Flock( int $handle , int $Operation [, int &$wouldblock ] )
PHP는 권고적인 방식으로 모든 파일을 잠그는 간단한 방법을 지원합니다(즉, 액세스하는 모든 프로그램은 동일한 방식으로 잠가야 하며 그렇지 않으면 작동하지 않습니다).

참고:

Flock()은 Windows에서 시행됩니다.

flock() 작업의 핸들은 열린 파일 포인터여야 합니다. 작업은 다음 값 중 하나일 수 있습니다.


공유 잠금(읽기 프로그램)을 얻으려면 작업을 LOCK_SH로 설정합니다(PHP 4.0.1 이전 버전에서는 1로 설정).
배타적 잠금(프로그램 작성)을 얻으려면 작업을 LOCK_EX로 설정합니다(PHP 4.0.1 이전 버전에서는 2로 설정).
잠금(공유 또는 배타적)을 해제하려면 작업을 LOCK_UN으로 설정하세요(PHP 4.0.1 이전 버전에서는 3으로 설정).
잠금 시 Flock()이 차단되는 것을 원하지 않으면 작업에 LOCK_NB를 추가하세요(PHP 4.0.1 이전 버전에서는 4로 설정).

flock()을 사용하면 모든 플랫폼(대부분의 Unix 파생 제품 및 Windows 포함)에서 사용할 수 있는 간단한 읽기/쓰기 모델을 구현할 수 있습니다. 선택적인 세 번째 매개변수는 잠금이 차단되는 경우(EWOULDBLOCK 오류 코드의 경우) TRUE로 설정됩니다. 잠금 작업은 fclose()에 의해 해제될 수도 있습니다(코드 실행이 완료되면 자동으로 호출되기도 함).

성공 시 TRUE, 실패 시 FALSE를 반환합니다.


예제 #1 Flock() 예

코드 복사 코드는 다음과 같습니다.

$fp = fopen("/tmp/lock.txt", "w+")
if (flock($fp, LOCK_EX)) { // 배타적 잠금 수행
fwrite($fp, "여기에 뭔가 쓰기 ")
flock($fp, LOCK_UN) // 잠금 해제
} else {
echo "파일을 잠글 수 없습니다!"
}
fclose($fp)
?>

참고: >
flock()에는 파일 포인터가 필요하므로 쓰기 모드에서 열려는 파일에 대한 액세스를 보호하기 위해 특수 잠금 파일을 사용해야 할 수도 있습니다(fopen() 함수에 "w" 또는 "w+" 추가) .

경고
flock()은 NFS 및 일부 다른 네트워크 파일 시스템과 함께 사용할 수 없습니다. 자세한 내용은 운영 체제 설명서를 확인하세요.
일부 운영 체제에서는 Flock()이 프로세스 수준에서 구현됩니다. 다중 스레드 서버 API(예: ISAPI)를 사용하는 경우 동일한 서버 인스턴스의 다른 병렬 스레드에서 실행되는 PHP 스크립트로 파일을 처리할 수 있으므로 Flock()을 사용하여 파일을 보호하는 것이 불가능할 수 있습니다.
flock()은 FAT 및 그 파생물과 같은 이전 파일 시스템을 지원하지 않습니다. 따라서 이 환경에서는 항상 FALSE가 반환됩니다(특히 Windows 98 사용자의 경우).


PHP의 파일 잠금 기능 Flock 기능 사용법 소개:
구문:

bool Flock(int $handle, int $Operation) [, int & $wouldblock ] )
flock() 작업의 핸들은 열린 파일 포인터여야 합니다. 작업은 다음 값 중 하나일 수 있습니다.
1. 공유 잠금(리더)을 얻으려면 작업을 LOCK_SH로 설정합니다(PHP 4.0.1 이전 버전에서는 1로 설정)
2. (작성자) 작업을 LOCK_EX로 설정합니다(PHP 4.0.1 이전 버전에서는 2로 설정)
3. 잠금을 해제하려면(공유 또는 배타적) 작업을 LOCK_UN으로 설정합니다(PHP 4.0.1 이전 버전에서는). 버전에서는 3으로 설정)
4. 잠금 시 Flock()을 차단하지 않으려면 작업에 LOCK_NB를 추가하세요(PHP 4.0.1 이전 버전에서는 4로 설정)

아래 참조 코드:

a.php

코드 복사 코드는 다음과 같습니다.
< ;?php
$file = "temp.txt";
$fp = fopen($file, 'w')
if(flock($fp, LOCK_EX)){
fwrite( $fp, "abc");
sleep(10);
fwrite($fp, "123")
flock($fp, LOCK_UN)
fclose($ fp)
?>


b.php


$file = "temp.txt"
$fp = fopen($file, 'r'); echo fread($fp, 100)
fclose($fp)


a.php를 실행한 후 즉시 b.php를 실행하면 출력을 볼 수 있습니다.
abc
a.php가 실행을 마칠 때까지 기다린 후 b.php를 실행하면 출력을 볼 수 있습니다.
abc
123
분명히 a.php가 파일을 작성하면 데이터가 너무 커서 시간이 오래 걸립니다. 이때 b.php는 불완전한 데이터를 읽습니다.
b.php를
코드 복사 로 수정합니다. 코드는 다음과 같습니다.

$file = " temp.txt";
$fp = fopen($file, 'r')
if(flock($fp, LOCK_EX)) {
echo fread($ fp, 100);
Flock($fp, LOCK_UN);
} else{
echo "파일 잠금 실패..."
fclose($fp); >?>


a.php를 실행한 후 b.php를 즉시 실행하면 b.php가 a.php가 완료될 때까지(즉, 10초 후) 표시된다는 것을 알 수 있습니다. : abc
123
읽기 데이터가 완전하지만, b.php를 변경하기 전에 쓰기 잠금이 해제될 때까지 기다려야 하는 시간이 너무 깁니다.
b.php를 다음으로 수정:


$file = "temp.txt";
$fp = fopen($file, 'r')
if (flock($fp, LOCK_SH | LOCK_NB)) 🎜>echo fread($fp, 100);
flock($fp, LOCK_UN);
} else{
echo “파일 잠금 실패…”; );
>?>


a.php를 실행한 후 즉시 b.php를 실행하면 다음과 같은 출력이 표시됩니다.
파일 잠금에 실패했습니다…
잠김이 확인되었습니다. 위와 같이 대기 시간이 오래 걸립니다. 대신 파일 실패 상태가 반환될 수 있습니다.
스크립트 하우스 편집자의 결론: 파일 캐싱 시 해당 잠금을 선택하는 것이 좋습니다. 그렇지 않으면 읽은 데이터가 불완전하거나 데이터가 반복적으로 기록될 수 있습니다.
file_get_contents는 잠금을 선택할 수 없는 것 같습니다. 기본적으로 어떤 잠금을 사용하는지 모르겠습니다. 어쨌든 잠금을 해제하여 얻은 출력은 불완전한 데이터와 같습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.