>백엔드 개발 >PHP 튜토리얼 >PHP 파일 잠금을 사용하는 방법은 무엇입니까? PHP 파일 잠금 소개 튜토리얼

PHP 파일 잠금을 사용하는 방법은 무엇입니까? PHP 파일 잠금 소개 튜토리얼

WBOY
WBOY원래의
2016-07-25 08:53:041077검색
  1. $file = "temp.txt";
  2. $fp = fopen($file , 'w')
  3. if(flock($fp , LOCK_EX)){
  4. fwrite($fp , "abcn");
  5. sleep(10)
  6. fwrite($fp , "123n")
  7. Flock($fp , LOCK_UN); 🎜>}
  8. fclose($fp);
코드 복사
2) b.php

  1. $file = "temp.txt";
  2. $fp = fopen($file , 'r')
  3. echo fread($ fp, 100);
  4. fclose($fp);
코드 복사
a.php 실행 후 바로 b.php 실행, 출력을 볼 수 있습니다. 알파벳 a.php 실행이 완료된 후 b.php를 실행하면 출력을 볼 수 있습니다. 알파벳 123 당연히 a.php가 파일을 쓰면 데이터가 너무 커서 시간이 오래 걸립니다. 이때 b.php는 데이터를 불완전하게 읽습니다. 위의 방법은

php 파일 잠금 작성 예제 튜토리얼에 소개되어 있습니다. 이해하지 못하는 친구는 기사의 예제를 참조하여 자세히 알아볼 수 있습니다.

b.php를 다음과 같이 수정하세요.

  1. $file = "temp.txt"
  2. $fp = fopen($file , 'r')
  3. if(flock( $fp , LOCK_EX)){
  4. echo fread($fp , 100);
  5. Flock($fp , LOCK_UN);
  6. } else{
  7. echo "파일 잠금 실패...n";
  8. }
  9. fclose($fp);
코드 복사
a.php를 실행한 후 즉시 b.php를 실행하세요. b.php는 a.php가 완료될 때까지(예: 10초 후) 표시하기 전에 대기합니다. 알파벳 123 데이터 읽기가 완료되었으나 시간이 너무 길어서 쓰기 잠금이 해제될 때까지 기다려야 합니다.

b.php를 다음과 같이 수정하세요.

  1. $file = "temp.txt"
  2. $fp = fopen($file , 'r')
  3. if(flock( $fp , LOCK_SH | LOCK_NB)){
  4. echo fread($fp , 100)
  5. Flock($fp , LOCK_UN)
  6. } else{
  7. echo "파일 잠금 실패...n ";
  8. }
  9. fclose($fp);
코드 복사
a.php 실행 후 바로 b.php 실행 , 출력을 볼 수 있습니다. 파일 잠금 실패… 위와 같이 오랜 시간을 기다리지 않고 잠금 파일 실패 상태를 반환할 수 있음이 입증되었습니다.

결론: 파일을 캐싱할 때 관련 잠금을 선택하는 것이 좋습니다. 그렇지 않으면 읽은 데이터가 불완전하거나 데이터가 반복적으로 기록될 수 있습니다. File_get_contents는 잠금을 선택할 수 없는 것 같습니다. 기본적으로 어떤 잠금을 사용하는지 모르겠습니다. 어쨌든 잠금을 해제하여 얻은 출력은 불완전한 데이터와 같습니다. 파일 캐싱을 하고 싶어서 쓰기 잠금이 있는지만 알면 되고, 있으면 데이터베이스만 확인하면 됩니다. 테스트 환경: Linux(Ubuntu 6), PHP 5.1.2, Apache 2

다시 게시: 파일 잠금에는 공유 잠금과 배타적 잠금, 즉 읽기 잠금(LOCK_SH)과 쓰기 잠금(LOCK_EX)의 두 가지 유형이 있습니다. 파일 잠금은 일반적으로 다음과 같이 사용됩니다.

  1. $fp = fopen("filename", "a");
  2. flock($fp, LOCK_SH) 또는 die("잠금 오류")
  3. $str = fread($fp, 1024);
  4. flock($fp, LOCK_UN);
  5. fclose($fp)
코드 복사

파일이 업데이트되기 전에 fwrite와 fclose를 기다리는 대신 fwrite 후에는 파일이 즉시 업데이트됩니다. 이는 fwrite 이후 fclose 이전에 파일을 읽어 확인할 수 있습니다.

그러나 언제 lock_ex를 사용하고 언제 lock_sh를 사용합니까?

1. 읽을 때: 더티 데이터가 표시되는 것을 원하지 않으면 lock_sh 공유 잠금을 사용하는 것이 가장 좋습니다. 다음 세 가지 상황을 고려할 수 있습니다. 1. 읽을 때 공유 잠금이 추가되지 않은 경우 다른 프로그램에서 쓰기를 원하면(쓰기 잠금 여부에 관계없이) 쓰기가 즉시 성공합니다. 정확히 절반을 다른 프로그램에서 읽고 쓴 경우, 읽은 내용의 후반부가 전반부와 일치하지 않을 수 있습니다(전반은 수정 전, 후반은 수정 후). 2. 읽을 때 공유 잠금을 추가하면(읽기만 하기 때문에 배타적 잠금을 사용할 필요가 없음) 이때 다른 프로그램이 쓰기 시작하고 쓰기 프로그램은 잠금을 사용하지 않습니다. 프로그램을 작성하면 파일이 직접 수정되므로 이전과 같은 문제가 발생합니다. 3. 가장 이상적인 상황은 읽을 때 잠금(lock_sh)하고 쓸 때 잠금(lock_ex)하는 것입니다. 이렇게 하면 쓰기 프로그램이 읽기 프로그램이 완료될 때까지 기다렸다가 작동하므로 성급한 작업이 발생하지 않습니다. >

두 번째, 글을 쓸 때: 여러 쓰기 프로그램이 잠금 없이 동시에 파일에서 작동하는 경우 최종 데이터의 일부는 프로그램 a에 의해, 일부는 프로그램 b에 의해 기록될 수 있습니다. 쓸 때 잠겨 있는데 이때 다른 프로그램이 읽으러 오면 무엇을 읽게 될까요? 1. 읽기 프로그램이 공유 잠금을 적용하지 않으면 더티 데이터를 읽습니다. 예를 들어, 프로그램을 작성할 때 a, b, c 세 부분을 작성해야 합니다. a를 작성한 후, 이때 읽는 내용은 b입니다. 그런 다음 ab를 작성합니다. 이때 읽은 내용은 abc 입니다. 2. 읽기 프로그램이 이전에 공유 잠금을 적용한 경우 읽기 프로그램은 쓰기 프로그램이 abc 쓰기를 완료할 때까지 기다리고 읽기 전에 잠금을 해제합니다.

위는 PHP 파일 잠금에 대한 입문 튜토리얼입니다. 비교 분석을 통해 PHP 파일 잠금 사용법을 자세히 설명합니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.