1

上書きエラーを回避するために flock() 関数を使用してファイルをブロックしようとしていますが、カウンターが頻繁にリセットされます (おそらく読み取りの問題のため)。

numeri.txt (カウンター)

4895|533753

frame.php (PHP ファイル)

$filename="numeri.txt";
$contents=file_get_contents($filename);
if(($fp=@fopen($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);
}

カウンターが "4895|533754" ではなく "|1" を返すことがあります。

どうすれば修正できますか?

4

1 に答える 1

2

2 つのスレッドがわずかな遅延でコードをほぼ同時に実行する場合、最初のスレッドは書き込み用にファイルを開き、ロックする前にその内容を消去します。

2 番目のスレッドは、空のファイルの内容を読み取り、ロックの解放を待ってから、正しいデータを上書きします。

解決策は、「w」モードではなく「a」または「c」モードでファイルを開き、fwrite、fseek、および ftruncate を使用することです。

于 2013-04-13T15:00:58.093 に答える