2011-03-27 9 views
5

나는 내 웹 사이트에서 사용법을 추적하기 위해 신참 (다음 문 십대)의 PHP 코드를 작성했습니다. 나는 PHP에 익숙하지 않아서 동시 파일 액세스에 대해 조금 묻고있다.PHP로 파일 잠금

내 기본 앱 (Windows)은 때때로 내 PHP 스크립트가 포함 된 URL을 눌러 내 사이트에 일부 데이터를 기록합니다. 원시 앱은 반환 된 데이터를 검사하지 않습니다.

 $fh = fopen($updateFile, 'a') or die("can't open file"); 
     fwrite($fh, $ip); 
     fwrite($fh, ', '); 
     fwrite($fh, $date); 
     fwrite($fh, ', '); 
     fwrite($fh, implode(', ', $_GET)); 
     fwrite($fh, "\r\n"); 
     fclose($fh); 

트래픽이 적은 사이트이며 데이터는 중요하지 않습니다. 그러나 두 명의 사용자가 충돌하고 두 개의 스크립트 인스턴스가 각각 파일에 행을 추가하려고하면 어떻게됩니까? php에서 암시 적 파일 잠금이 있습니까?

위의 코드는 잠금을 해제하고 내 사용자에게 제어 권한을 반환하지 않는 것이 안전합니까? 파일이 손상 될 수 있습니까? 위의 스크립트를 사용하여 매월 파일을 삭제 한 경우 스크립트의 다른 인스턴스가 파일에 쓰는 중일 때 어떻게됩니까?

답변

9

당신은 파일에 잠금을 넣어해야합니다

<?php 
$fp = fopen($updateFile, 'w+'); 
if(flock($fp, LOCK_EX)) { 
fwrite($fp, 'a'); 
flock($fp, LOCK_UN); 
} else { 
echo 'can\'t lock'; 
} 

fclose($fp); 
+0

정확히 내가 찾고 있었던 것, 레이먼드. 감사. 방금 한 다른 독서 (http://www.tuxradar.com/practicalphp/8/11/0)에서 echo 문에 절대로 도달 할 수없는 것으로 보입니다. 첫 번째 프로세스에서 파일 잠금을 해제 할 때까지 두 번째 프로세스 블록이 flock 호출에서 차단되지 않습니까? echo 문에 도달 할 수 있도록 flock에 OR LOCK_NB가 필요하지 않습니까? – RobertFrank

+0

위의 반향 설명에 도달했는지 아닌지에 대한 견해로 호나 다른 누군가로부터 응답을 받기를 희망했다. – RobertFrank

+4

예, 코드에'| LOCK_NB'가 필요합니다. 그렇지 않으면 잠금이 이미 잠겨 있으면 잠금이 잠길 것입니다. :) – cweiske

3

을이 파일에 _가 있기 때문에, 가장 좋은 방법은() 데이터를 집계 한에 fwrite에서 파일에 기록하는 것 기입 해지는 데이터가 파일 버퍼보다 ​​크지 않다는 것을 제공한다. 물론 버퍼의 크기를 알 수는 없으므로 flock(); 항상 좋은 선택입니다.

+0

나는 둘 다 할 것이다 : 하나의'fwrite()'*에 쓰기를 유지하고 파일을 잠근다. 일부 리눅스 플랫폼과 일부 오래된 파일 시스템에서'flock()'은 실제로 파일을 잠그지 않을 수도 있습니다. – Jason