【问题标题】:simple php page session visit counter not working简单的 php 页面会话访问计数器不起作用
【发布时间】:2017-04-29 14:42:20
【问题描述】:

我遇到了这个奇怪的问题,无法弄清楚。

在某些网站上,我的脚本运行良好...相同的代码,相同的服务器设置...

使用 php,有一个简单的页面查看命中计数器,它在本地存储在一个 txt 文件中。

然后我在我网站的页脚版权区域中呼应这个值,以便给客户一个快速的统计数据……它的增长速度非常酷。

无论如何.. 我有一个客户角落烧烤纽约。 com(seo 目的我加了空格)

在那个网站上.. 它多年来一直运行良好。

现在是另一个网站和更多......例如...... savianos 。 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/ 文件夹有 counter.php 和 hits.txt 文件

网站的每一页都是第一件事

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

在我们网站的页脚中

 <?php echo $counterVal; ?>

【问题讨论】:

    标签: php counter


    【解决方案1】:

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

    Visits counter without database with PHP

    【讨论】:

    • 看来这对我有用。 if ( $counterVal >= "1" ) { run the increment },我假设因为脚本将到达这一点并在看不到数字时停止运行,因此没有机会用 .txt 文件覆盖空白。
    【解决方案2】:

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

    如果您想查看我正在运行的计数器之一,请尝试http://ozlu.org。该动态计数器图像是自建的。 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多