【问题标题】:PHP - Counter issue using flock functionPHP - 使用flock函数的计数器问题
【发布时间】:2013-04-12 22:07:22
【问题描述】:

我正在尝试使用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”。

我该如何解决?

【问题讨论】:

  • 可能你运行脚本frame.php两次,延迟很小?
  • 这是一个计数器,脚本在一分钟内运行超过 60 次。我使用了羊群功能来避免问题,但它仍然无法正常工作。

标签: php counter flock


【解决方案1】:

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

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

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

【讨论】:

  • 我在你回答之前就这样做了,现在它工作正常。但我为什么要使用 fseek?
  • 你的情况不需要,只是普通情况备注。
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 2013-05-23
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多