PHP - 使用flock函数的计数器问题

时间:2013-04-12 22:07:23

标签: php counter flock

我试图使用flock()函数阻止文件以避免覆盖错误,但计数器经常重置(可能是读取问题)。

numeri.txt(counter)

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);
}

有时计数器返回“| 1”而不是“4895 | 533754”。

我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果两个线程几乎同时使用小延迟执行代码,第一个线程将打开文件进行写入并在锁定之前将其擦除。

第二个线程将读取空文件内容,等待锁定释放,然后覆盖正确的数据。

解决方案是打开不在“w”中的文件,而是在“a”或“c”模式下,然后使用fwrite,fseek和ftruncate。