2012-04-24 5 views
2

좋아,이 사이트에이 문제와 관련하여 비슷한 질문이 있지만이 질문과 제공된 답변 중 내가 원하는 것은 맞지 않습니다.동시에 동일한 파일에 쓰기

저는 플랫 파일 기반의 CMS를 구축 중입니다. 무엇, 예를 들어 :

  1. 2, 3, 10 ..... 모드 추가에에 fwrite가 동시에 같은 PHP 파일 "contact_form_messages_container.php"올 requestes

    ?

  2. 2, 3, 10 ..... "w"모드에서의 fwrite는 특정 페이지 방문에 대한 간단한 nubmer를 동시에 보유하는 동일한 PHP 파일을 요청합니다.

내가 무리() 함수에 대해 알고,하지만() 요청에 두 개 이상의 무리 일이 같은 시간에 제공 할 수 ... 누군가는이 문제에 대한 해결책을 알고 있습니까? 내가 마음에 가지고있는 것은 usleep()이다. looop을 약간의 시간 동안 사용하면서 스크립트를 사용하면 대상 파일이 availibile이 될 때까지 사용할 수 있지만 작동하는지, 어떻게 그리고 어떻게 수행 할 지 모른다. 누구든지이 문제에 실질적인 만기가 있습니까? 미리 감사드립니다.

+0

실제 답변이 아니지만 데이터베이스를 사용하십시오. 정말. :피 –

답변

0

flock() 기능은 파일 조작을 위해 여러 개의 동시 판독기와 기록기를 처리하도록 설계되었습니다. 기본적으로 flock()은 호환 가능한 잠금을 얻을 수있을 때까지 (즉 공유 또는 독점) 프로세스를 일시 중단 할 수 있습니다. 일단 획득되면 잠금은 나중에 다른 프로세스가 파일에서 작동 할 수 있도록 해제 될 수 있습니다. 잠금은 파일이 닫히거나 프로세스가 종료 될 때 내재적으로 해제됩니다.

파일이 NFS에있는 경우를 제외하고는 두 개의 충돌하는 잠금이 동시에 발생하는 상황에 처하게 될지 의심 스럽습니다.


다음은 기본 flock()을 사용하는 예를 보여 중단되는 공정을 방지하거나 LOCK_EXLOCK_SH 함께 LOCK_NB 플래그를 사용

// open the file (take care to not use "w" mode) 
$f = fopen('file.txt', 'r+'); 
// obtain an exlusive lock (may suspend the process) 
if (flock($f, LOCK_EX)) { 
    // this process now holds the only exclusive lock 

    // make changes to the file 

    // release the lock 
    flock($f, LOCK_UN); 
} 
// don't perform any write operation on $f here 
fclose($f); 

단계; 호출이 false을 반환하면 세 번째 매개 변수를 전달하여 프로세스가 일시 중단되었는지 여부를 확인할 수 있습니다 (Windows에서는 지원되지 않음).

if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // the lock could not be obtained without suspending the process 
    } else { 
     // the lock could not be obtained due to an error 
    } 
} 
0

파일을 잠그고 파일을 잠그는 동안 쓰기 작업을 while 루프에 넣습니다. 응용 프로그램이 파일 시스템 호출을 시간순으로 작성하는 데 의존하지 않는 한 작동해야합니다.

그러나 애플리케이션이 순서대로 수행되도록 쓰기 작업에 의존하는 경우 이는 경쟁 조건에 대해 열립니다.