2013-12-08 4 views
5

PHP에서 mecanism을 뽐내고 있는데 LOCK_SH 모드의 기능을 이해하는 데 어려움을 겪고 있습니다. 사이트에서 파일을 잠그기 때문에 다른 스크립트에서 쓰기를 할 수 없지만 읽을 수는 있습니다. 다음 코드는 예상대로 작동하지 않았다 그러나 :LOCK_SH는 어떻게 작동합니까?

$fp = fopen('my_file.txt','r'); 

flock($fp, LOCK_SH); 
sleep(20); 
flock($fp, LOCK_UN); 

을 그리고 file2.php에 나는

$fp = fopen('my_file.txt','a'); 
fwrite($fp,'test'); 

내가 파일을 잠그는 첫 번째 스크립트를 실행해야 : file1.php에서 나는이 20 초 동안. 잠금 장치가있는 상태에서 file2.php를 실행하여 즉시 실행을 마친 후 'my_file.txt'열 때 'test'문자열이 추가되었습니다 ('file1.php'는 여전히 실행 중입니다). 나는 'file2.php'를 변경하여 잠긴 파일과 문제가없는 빨간색 파일을 읽으려고 시도합니다. 그래서 분명히 ... 'LOCK_SH'솔기는 전혀하지 않습니다. 그러나 LOCK_EX를 사용하면 파일을 잠그므로 스크립트에서 파일에 쓰거나 읽을 수 없습니다. 나는 Easy PHP를 사용 중이며 Windows 7에서 실행 중입니다.

답변

4

flock()은 필수 잠금이 아닌 권고 잠금을 구현합니다. file2.phpfile1.php의 잠금에 의해 차단되도록하려면 쓰기 전에 파일에 쓰기 (LOCK_EX) 잠금을 획득해야합니다.

+0

는 지금은 이해합니다. 당신이 설명했던 메커니즘을 테스트했고 문제없이 작동했습니다. 당신은 최고입니다. –

14

LOCK_SH는 SHARED LOCK을 의미합니다. 프로세스 수에 관계없이 동시에 을 공유 할 수 있습니다. 흔히 독자 잠금이라고합니다.

LOCK_EX은 독점 잠금을 의미합니다. 단일 프로세스는 한 번에 주어진 파일에 대해 배타적 잠금을 소유 할 수 있습니다.

파일이 다른 프로세스에서 LOCK_SH로 잠금 설정된 경우 LOCK_SH가 포함 된 이라는 이름의 SUCCEED가 표시됩니다. LOCK_EX가있는 무리는 모두 독자가 잠겼을 때 차단됩니다.

http://php.net/manual/en/function.flock.php#78318

+0

와우 어떻게 10 년 전부터 그 의견을 찾았습니까? D? 고맙습니다 SHER_LOCK – Adam