使用PHP统计网站访问量:脚本仅能从0增至1,后续失效求助
嘿,我瞅见你的网站访问计数器只能从0涨到1就卡住了,这问题我之前也碰到过,来给你捋捋原因,再给你修好的代码!
问题出在哪?
你的脚本核心问题在文件打开模式上:
- 你用了
fopen("counterfile.txt", "w+"),这个模式会直接清空文件内容再打开——哪怕文件里原本存着之前的计数! - 第一次运行时,文件里的
0被清空,fgets()读到空字符串,intval()转成0,加1后写入1,看起来正常。但之后再有新用户访问时,进入if块后又用w+打开文件,把之前的1清空,再次读到空转成0,加1还是1,所以数值永远停在1。 - 另外,
fgets()默认只读取一行,虽然当前场景下影响不大,但用更稳妥的方式读取整个文件内容会更可靠。
修复后的代码(两种方案)
方案1:改进原有的文件操作逻辑
保留你原来的fopen思路,但调整打开模式和读取顺序:
<?php if(!isset($_COOKIE['countedUser'])) { // 设置30天有效期的cookie,避免同一用户重复计数 setcookie("countedUser", "0", time() + (86400 * 30)); // 先读取现有计数,文件不存在则初始化为0 $count = 0; if(file_exists("counterfile.txt")) { $countfile = fopen("counterfile.txt", "r") or die("Unable to open file!"); $count = intval(fgets($countfile)); fclose($countfile); } // 写入新的计数 $countfile = fopen("counterfile.txt", "w") or die("Unable to open file!"); fwrite($countfile, $count + 1); fclose($countfile); } // 输出当前计数 echo file_get_contents('counterfile.txt');
方案2:用更简洁的PHP文件函数(推荐)
PHP自带file_get_contents和file_put_contents,能减少手动打开/关闭文件的错误,代码更简洁:
<?php if(!isset($_COOKIE['countedUser'])) { setcookie("countedUser", "0", time() + (86400 * 30)); // 读取现有计数,文件不存在则初始化为0 $count = file_exists("counterfile.txt") ? intval(file_get_contents("counterfile.txt")) : 0; // 写入新的计数 file_put_contents("counterfile.txt", $count + 1); } echo file_get_contents('counterfile.txt');
额外注意事项
- 确保你的服务器对
counterfile.txt所在的目录有写入权限,不然脚本会报错无法写入计数。 setcookie必须放在任何输出(包括echo、空格、HTML标签)之前,不然cookie会失效——你的原脚本里这点是对的,之后如果加HTML内容要注意顺序。- 这个计数器基于cookie,同一个用户30天内只会被计数一次,要是用户手动清除了浏览器cookie,会被再次统计,这符合你的需求~
内容的提问来源于stack exchange,提问作者u3113460
相关产品推荐
相关产品推荐

