我的非独特点击计数器存在问题。
脚本如下:
$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.
是否有解决此问题的猜测?
答案 0 :(得分:1)
这是维护计数器的一种非常糟糕的方法,但是您的问题可能是当您在站点上发出多个请求时,对file_exists()
的一个调用是错误的,因为其中一个进程是删除并重新创建文件。
如果你想让它一直工作,你将不得不在读写之间锁定文件See flock on php manual
当然,如果没有文件锁定,当2个进程设法从文件中读取相同的值时,你也会得到不正确的计数。
锁定文件也可能会导致系统停机,因为有2个或更多进程排队访问该文件。
将计数器存储在数据库中可能更好一点,因为它们旨在应对这种快速访问并确保每个进程都正确排队和释放。
答案 1 :(得分:0)
如果你添加一个检查文件,如果file_get_contents没有返回false会有帮助吗?
$value = file_get_contents($filename);
if($value !== false)
{
$current_value = $value
}