2013-04-12 1 views
1

flock() 함수를 사용하여 덮어 쓰기 오류를 방지하기 위해 파일을 차단하려고하지만 카운터가 종종 재설정됩니다 (읽기 문제 일 가능성이 있음). 대신 "| 533754 4895"의 |PHP - flock 함수를 사용한 카운터 문제

numeri.txt (카운터)

4895|533753 

frame.php (PHP 파일)

$filename="numeri.txt"; 
$contents=file_get_contents($filename); 
if(([email protected]($filename,'w'))!==false) 
{ 
    if(flock($fp,LOCK_EX)) 
    { 
     $contents=explode("|",$contents); 
     $clicks=$contents[0]; 
     $impressions=$contents[1]+1; 
     fwrite($fp,$clicks."|".$impressions); 
     flock($fp,LOCK_UN); 
    } 
    fclose($fp); 
} 
때때로

카운터 반환 "1".

어떻게 해결할 수 있습니까?

+0

작은 지연으로 두 번 frame.php 스크립트를 실행할 수 있습니까? – zavg

+0

카운터입니다. 스크립트는 1 분에 60 회 이상 실행됩니다. 문제를 피하기 위해 무리 함수를 사용했지만 여전히 작동하지 않습니다. – Megadv

답변

2

작은 지연으로 거의 동시에 두 개의 스레드가 코드를 실행하면 첫 번째 스레드는 쓰기 위해 파일을 열고 잠금 전에 내용을 지 웁니다.

두 번째 스레드는 빈 파일 내용을 읽고 잠금 해제를 기다린 다음 올바른 데이터를 덮어 씁니다.

해결책은 "w"가 아닌 "a"또는 "c"모드에서 파일을 연 다음 fwrite, fseek 및 ftruncate를 사용하는 것입니다.

+0

나는 당신의 대답 전에 그것을했고 지금은 잘 작동합니다. 하지만 fseek를 사용해야하는 이유는 무엇입니까? – Megadv

+1

귀하의 경우에는 필요하지 않으며, 단지 일반적인 경우입니다. – zavg