0

我的非唯一命中计数器有问题。

脚本如下:

$filename = 'counter.txt';
if (file_exists($filename)) {
    $current_value = file_get_contents($filename);
} else {
    $current_value = 0;
}
$current_value++;
file_put_contents($filename, $current_value);

当我经常刷新我的网站时(比如每秒 10 次甚至更快),文本文件中的值被重置为 0。

任何猜测解决这个问题?

4

2 回答 2

0

这是维护计数器的一种非常糟糕的方法,但是您的问题可能是当您在站点上触发多个请求时,其中一个调用file_exists()是错误的,因为其他进程之一正在删除和重新创建文件。

如果您希望它始终如一地工作,您将不得不在读取和写入之间锁定文件请参阅 php 手册上的flock

当然,如果没有文件锁定,当 2 个进程设法从文件中读取相同的值时,无论如何您也会得到不正确的计数。

锁定文件还可能会降低系统速度,因为有 2 个或更多进程排队等待访问文件。

将您的计数器存储在数据库中可能是一个更好的主意,因为它们旨在应对这种快速访问并确保每个进程都正确排队和释放。

于 2014-06-09T10:31:47.767 回答
0

如果您添加检查 file_get_contents 是否返回 false 是否有帮助?

$value = file_get_contents($filename);
if($value !== false)
{
    $current_value = $value
}
于 2014-06-09T10:33:55.277 回答