首页 > 解决方案 > 使用 PHP 在页面查看计数器中获取异常错误

问题描述

我有fwrite一个 .txt 文件中的页面视图计数器脚本,我在另一个文件中回显它,我必须在其中显示页面视图。计数器更新脚本是:

$handle = fopen("counter.txt", "r");
if(!$handle){

    echo "could not open the file" ;

} else {

    $counter = (int ) fread($handle,20);
    fclose ($handle);
    $counter++;
    $handle = fopen("counter.txt", "w" );
    fwrite($handle,$counter) ;
    fclose ($handle) ;
}

上面的代码fwrite在文件名中写入 ( ) 页面浏览量counter.txt

而我要显示页面浏览量的页面也是 HTML 和 PHP 的组合。我在那里添加的代码如下,读取视图并显示它

$handle = fopen("counter.txt", "r"); 
if(!$handle){ 
    echo "could not open the file" ; 
} else { 
    $counter = ( int ) fread ($handle,20) ; 
}

echo $counter;

上面的代码显示了页面浏览量。它从counter.txt文件中读取并显示页面视图。

为此我收到异常错误。当我试图通过它访问文件时,desktop它显示错误的页面视图。它增加了额外的1视野。例如,如果只有1页面视图,它会显示2

但在androidios设备上它工作正常。对于androidios显示正确计数的设备。我想知道代码有问题吗?简而言之,上面的脚本每次都显示 +1(额外的 1 个视图)。(仅适用于笔记本电脑或个人电脑)

标签: php

解决方案


正如其他人所说,用 PHP 中的简单文件做一个计数器不是一个好主意。网页上有许多您不知道的点击量(例如搜索引擎、已知和未知的蜘蛛、普通访问者……)。这些可能会或可能不会干扰并希望同时访问此文件。这会导致不清楚的情况,这可能会导致奇怪的错误。因此,最重要的提示是使用能够在访问期间锁定数据并使添加数据安全的数据库。

让我们看看你的代码:最大的问题之一是,写你的文件意味着操作系统会清除文件并重写它。在最坏的情况下,这意味着硬盘启动,将自身定位在文件中,尝试打开它,清除它,向其中写入数据并随后关闭它。这将需要很多周期 - 足够的时间被其他尝试访问您的页面的人打断。当然,SSD 的工作速度要快得多,但在数据冲突方面则不然。

如果您不能使用数据库,我们需要尝试“锁定”您的文件以供一次性使用。这是您更新的代码:

$handle = fopen("counter.txt", "r");
if(!$handle){
    echo "could not open the file" ;
} else {
   $counter = (int ) fread($handle,20);
   fclose ($handle);
   $counter++;

   $handle = fopen("counter.txt", "w" );
   if (flock($handle, LOCK_EX | LOCK_NB)) {
       fwrite($handle, $counter) ;
       flock($handle, LOCK_UN);   // open the lock again
   }
   fclose ($handle) ;
}

这会尝试锁定您的文件。如果它不可锁定,它不会阻止进一步的执行,而是通过 fwrite-line。您可以删除 LOCK_NB 但这意味着您的服务器将等到块被提升,这可能需要一段时间。阻止网络服务器不是一个好主意,所以也许不计算访问者是更好的方法。

第三种-稍微复杂一点 - 方法是在目录中为访问者编写唯一文件,并自动收集投票(例如 cron-job),该投票可以单一访问您的访问者文件。这样你就不会发生碰撞。

快乐编码。


推荐阅读