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

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

我该如何解决?

4

1 回答 1

2

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

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

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

于 2013-04-13T15:00:58.093 回答