파일 잠금에는 공유 잠금과 배타적 잠금의 두 가지 유형이 있습니다. 즉, 읽기 잠금(LOCK_SH)과 쓰기 잠금(LOCK_EX)이 있습니다.
파일 잠금은 일반적으로 다음과 같이 사용됩니다.
$fp = fopen("filename", "a"); flock($fp, LOCK_SH) or die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN); fclose($fp);
파일이 업데이트되기 전에 fwrite를 기다린 다음 fclose를 기다리는 대신 fwrite 후에 파일이 즉시 업데이트됩니다. 이는 fwrite 이후 fclose 이전에 파일을 읽어 확인할 수 있습니다.
그러나 lock_ex를 사용하려면 언제 lock_sh를 사용하면 되나요?
읽을 때:
더티 데이터가 표시되는 것을 원하지 않으면 lock_sh 공유 잠금을 사용하는 것이 가장 좋습니다. 다음 세 가지 상황을 고려할 수 있습니다.
1. 읽을 때 공유 잠금이 추가되지 않은 경우 다른 프로그램이 쓰기를 원하면(쓰기 잠금 여부에 관계없이) 쓰기가 즉시 성공합니다. . 정확히 절반을 다른 프로그램에서 읽고 쓴 경우, 읽은 후반부가 전반부와 일치하지 않을 수 있습니다(전반은 수정 전, 후반은 수정 후)
2 읽기시 공유 잠금을 추가하면(읽기만 하기 때문에 배타적 잠금을 사용할 필요가 없음) 이때 다른 프로그램이 쓰기 시작하고 쓰기 프로그램은 잠금을 사용하지 않으므로 쓰기가 시작됩니다. 프로그램이 파일을 직접 수정하게 되므로 이전과 같은 상황이 발생하게 됩니다. 문제
3. 이상적인 상황은 읽을 때 잠금(lock_sh)하고 쓸 때 잠금(lock_ex)하는 것입니다. 쓰기 프로그램은 읽기 프로그램이 완료될 때까지 기다렸다가 작동합니다.
쓰기 시:
여러 쓰기 프로그램이 잠금 없이 동시에 파일에 작동하는 경우 , 그러면 최종 데이터의 일부는 프로그램 a에 의해 기록될 수 있고, 일부는 프로그램 b에 의해 기록될 수 있습니다.
작성 시 잠겨 있는데 이때 다른 프로그램이 읽어오면 어떻게 될까요? 읽다?
1. 리더가 공유 잠금을 적용하지 않으면 더티 데이터를 읽습니다. 예를 들어, 프로그램을 작성할 때 a, b, c 세 부분을 작성해야 합니다. a를 작성한 후 이때 읽는 내용은 a입니다. b를 계속 작성하면 읽는 내용은 ab입니다. write c. 이때 읽은 내용은 abc 입니다.
2. 읽기 프로그램이 이전에 공유 잠금을 적용한 경우 읽기 프로그램은 쓰기 프로그램이 abc 쓰기를 마치고 잠금을 해제할 때까지 기다립니다. 읽기 전에.