简单php页面会话访问计数器不工作

简单php页面会话访问计数器不工作,php,counter,Php,Counter,我有一个奇怪的问题,无法解决 在一些网站上,我有这个脚本的作品完美。。。相同的代码,相同的服务器设置 对于php,有一个简单的页面视图命中计数器,它存储在本地的txt文件中 然后我在我的网站的页脚版权区域回显值,给客户一个快速统计。。。它长得这么快真是太酷了 无论如何。。我在纽约有一家客户烤肉店。com(seo目的I添加空间) 在那个网站上。。多年来它一直工作得很好 现在,另一个网站和一堆更多。。例如萨维亚诺斯。com 这打破了。。文本值为空 这是counter.php代码 <?php

我有一个奇怪的问题,无法解决

在一些网站上,我有这个脚本的作品完美。。。相同的代码,相同的服务器设置

对于php,有一个简单的页面视图命中计数器,它存储在本地的txt文件中

然后我在我的网站的页脚版权区域回显值,给客户一个快速统计。。。它长得这么快真是太酷了

无论如何。。我在纽约有一家客户烤肉店。com(seo目的I添加空间)

在那个网站上。。多年来它一直工作得很好

现在,另一个网站和一堆更多。。例如萨维亚诺斯。com

这打破了。。文本值为空

这是counter.php代码

 <?php
session_start();
$counter_name = "counter/hits.txt";

//Check if a text file exists. If not create one and initialize it to zero.
if (!file_exists($counter_name)) {
  $f = fopen($counter_name, "w");
  fwrite($f,"0");
  fclose($f);
}

// Read the current value of our counter file
$f = fopen($counter_name,"r");
$counterVal = fread($f, filesize($counter_name));
fclose($f);

// Has visitor been counted in this session?
// If not, increase counter value by one
if(!isset($_SESSION['hasVisited'])){
  $_SESSION['hasVisited']="yes";
  $counterVal++;
  $f = fopen($counter_name, "w");
  fwrite($f, $counterVal);
  fclose($f); 
}

?>

现在,如果我在txt文件中添加一个值。。比如1040。。。然后去网站,它开始工作了。。。大约一周后,我检查了一下。。又是一片空白

有什么想法吗

我想这可能是因为该网站可能会在周五晚上的晚餐时间获得大量的浏览量。。而简单的脚本无法如此处理。。当它试图写一个加法时,它只是中断并变为空白。。再也不会重新开始了

结构是这样的

/计数器/文件夹已关闭 counter.php和hits.txt文件

网站的每一页首先要做的就是

 <?php include ('counter/counter.php'); ?>

在我们网站的页脚

 <?php echo $counterVal; ?>

您的代码看起来很完美,但让我们了解一下情况。您有一个可供多个用户同时访问的文件,因为页面访问可由多个用户同时完成。这似乎不对,当有人修改文件时,您必须为其他用户锁定文件操作,对吗?。请看一看


这很可能是因为您有两个并发脚本试图在一个位置打开文件,但其中一个失败。当脚本的多个实例可以同时运行时,必须使用flock()。如果要使用文件读写,计数器是最重的东西之一。我编写这个包装器是为了轻松实现文件锁定

如果您想查看我的一个正在运行的计数器,请尝试。动态计数器图像是自建的。fileReadAll将一次性读取整个文件。文件编写器只有两种模式:写入或附加。您可以向fileWriter传递数组或字符串,它会将其写入文件。该函数不会添加任何\n格式的文本,因此您必须添加该格式。如果未设置第三个参数,则fileWriteAll的默认模式为w

function fileWriteAll($file, $content, $mode = "w"){
    $mode = $mode === "w" || $mode === "a"? $mode : "w";
    $FILE = fopen($file, $mode);
        while (!flock($FILE, LOCK_EX)) { usleep(1); }
        if( is_array($content) ){
            for ($i = 0; $i < count($content); $i++){
                fwrite($FILE, $content[$i]);
            }
        } else {
            fwrite($FILE, $content);
        }
     flock($FILE, LOCK_UN);
     fclose($FILE);
}

function fileReadAll($file){
    $FILE = fopen($file, 'r');
        while (!flock($FILE, LOCK_SH)) { usleep(1); }
        $content = fread($FILE, filesize($file));
        flock($FILE, LOCK_UN);
    fclose($FILE);
    return $content;
}
函数fileWriteAll($file,$content,$mode=“w”){
$mode=$mode===“w”| |$mode===“a”?$mode:“w”;
$FILE=fopen($FILE$mode);
而(!flock($FILE,LOCK_EX)){usleep(1);}
if(is_数组($content)){
对于($i=0;$i
这似乎对我有效。如果($counterVal>=“1”){runtheincrement},我假设,因为脚本将到达这一点,如果看不到数字,则会停止运行,因此没有机会使用空白对.txt文件进行过右处理。