如何解决如何创建一个可能对并发访问者存活的 PHP 计数器?
我用 PHP 开发了一个非常简单的计数器。它按预期工作,但偶尔会重置为零。不知道为什么。我怀疑它可能与并发访问者有关,但我不知道如何防止这种情况,以防万一我是正确的。代码如下:
function updateCounter($logfile) {
$count = (int)file_get_contents($logfile);
$file = fopen($logfile,'w');
if (flock($file,LOCK_EX)) {
$count++ ;
fwrite($file,$count);
flock($file,LOCK_UN);
}
fclose($file);
return number_format((float)$count,','.') ;
}
提前致谢。
解决方法
锁定文件上的file_get_contents 可能会得到一个“假”(== 0),并且在写入时日志文件可能会再次解锁。
经典的竞争条件...
,我会在文件中附加一个字符,并在文件内容上使用 strlen 来获取命中。请注意,您的文件会超时,但这可以通过将其汇总并将其缓存到另一个只读文件中的 cronjob 轻松解决。
您还可以使用 !is_writeable 并检查它是否被锁定,如果是,您可能会错过命中或等待 while 循环直到其可写。棘手,但它的工作原理。这取决于每次命中的价值以及您愿意在此计数器上投入多少精力。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。