2013-03-15 3 views
0

웹 사이트의 광고 (배너)를 기록하고 .dat 파일에 저장하는 PHP 스크립트가 있습니다. 이 파일 안에 ID, URL, 기타 중요한 정보가 저장됩니다. 내가 겪고있는 문제는 주어진 시간에 4 개의 광고가 페이지에 있으므로 PHP 스크립트가 열려있는 동안 PHP 스크립트가이 파일에 글을 쓰려고 할 때 .dat 파일이 종종 손상된다는 것입니다.
나는 확인하고, 그러나 그것은 나에게 도움이되지 않았다이 솔루션을 시도 : 내가 지금 사용하고있는 기능은 다음과 같습니다 PHP Simultaneous file access/flock() issuePHP Flock 열기 파일에 쓰기

:

function writeads(){ 
    global $bannerAdsPath, $ads, $bannerAds; 
    $data = fopen($bannerAdsPath, 'w') or die(); 
    flock($data, 2) or die(); 
    fputs($data, @join("\n", $ads)."\n"); 
    while (list ($key, $val) = each ($bannerAds)) { 
     if (($key != '') && ($val != '')) { 
      fputs($data, $key.'='.$val."\n"); 
     } 
    } 
    flock($data, 3); 
    fclose($data); 
    reset($bannerAds); 
} 

내가 긁는 한으로 어떤 도움을 주시면 감사하겠습니다 잠시 동안 내 머리. 정보의 옆 비트, 클라이언트는 파일 대신 데이터베이스를 사용하도록 코드를 다시 작성하지 않으므로 옵션이 꺼져 있습니다.

감사합니다.

+0

상수'LOCK_EX'와'LOCK_UN'을 사용하십시오. 이렇게하면 가독성이 향상됩니다. –

답변

0

flock을 사용하여 파일을 잠금 해제하려는 경우는 거의 없습니다. 그냥 fclose을 사용하십시오. 핸들이 닫히면 파일이 잠금 해제되고 잠금을 해제 한 후에는 버퍼링 된 쓰기가 발생하지 않습니다.

+0

암시 적 잠금은 PHP 5.3.2부터 더 이상 발생하지 않습니다. 또한 이것은 OP의 문제가 아닙니다. 모드'w'에서 암시 적으로'fopen()'의 절사가 손상을 일으키고 있습니다. –

+0

@MarkusMalkusch 암시 적 잠금 해제 * 수행 *; 그것은 단지 PHP 대신 불필요하고 잘못된'flock (..., LOCK_UN)'을 수행하는 대신 OS에 의해 수행됩니다. – hobbs

+0

사실, 그렇게됩니다. 그러나 귀하의 답변이 OP 문제에 어떻게 부합하는지 아직 알 수 없습니다. –

1

'w'가있는 파일을 열면 파일을자를 수있는 옵션이 있기 전에 잘립니다.