PHP计数器与羊群

I have a problem with a counter. I need to count two variables, separated with a |, but sometimes the counter doesn't increase a variable's value.

numeri.txt (the counter):

6122|742610

This is the PHP script:

$filename="numeri.txt";
while(!$fp=fopen($filename,'c+'))
{
    usleep(100000);
}
while(!flock($fp,LOCK_EX))
{
    usleep(100000);
}
$contents=fread($fp,filesize($filename));
ftruncate($fp,0);
rewind($fp);
$contents=explode("|",$contents);
$clicks=$contents[0];
$impressions=$contents[1]+1;
fwrite($fp,$clicks."|".$impressions);
flock($fp,LOCK_UN);
fclose($fp);

I have another counter that is a lot slower but counts both values (clicks and impressions) exactly. Sometimes the counter numeri.txt counts more impressions than the other counter. Why? How can I fix this?

Try performing a flush before unlocking. You're unlocking before the data might even be written, allowing another execution to clobber.

http://php.net/manual/en/function.fflush.php

We're using the following at our high-traffic site to count impressions:

<?php

    $countfile = "counter.txt"; // SET THIS

    $yearmonthday = date("Y.m.d");
    $yearmonth = date("Y.m");;

    // Read the current counts
    $countFileHandler = fopen($countfile, "r+");
    if (!$countFileHandler) {
        die("Can't open count file");
    }

    if (flock($countFileHandler, LOCK_EX)) {
        while (($line = fgets($countFileHandler)) !== false) {
            list($date, $count) = explode(":", trim($line));
            $counts[$date] = $count;
        }

        $counts[$yearmonthday]++;
        $counts[$yearmonth]++;

        fseek($countFileHandler, 0);

        // Write the counts back to the file
        krsort($counts);
        foreach ($counts as $date => $count) {
            fwrite($countFileHandler, "$date:$count
");
            fflush($countFileHandler);
        }

        flock($countFileHandler, LOCK_UN);
    } else {
        echo "Couldn't acquire file lock!";
    }

    fclose($countFileHandler);
}
?>

The results are both daily and monthly totals:

2015.10.02:40513
2015.10.01:48396
2015.10:88909