【问题标题】:PHP only Hit Counter?PHP只有命中计数器?
【发布时间】:2013-09-28 08:52:07
【问题描述】:

所以,我多年前曾经玩过网络开发,我有点生疏,但没那么生疏!

前几天我刚刚制作了一个完整的视频游戏页面,使用 PHP 变量将不同的游戏加载到不同大小的 iframe 中。话虽如此,为什么我不能让一个简单的 PHP 计数器工作呢?我已经在一个又一个脚本之后下载了脚本,将 txt 文件 CHMOD'ed 为 777,整个 9. Chrome 不支持命中计数器之类的吗?似乎即使是我访问的通过它们提供命中计数器的网站也无法在他们的演示页面上运行!什么是交易?我记得几年前,我复制了大约 10 行非常基本的代码,将其保存为 PHP 文件,将其与空白 txt 文件一起上传到服务器,然后 bam,每次都能完美运行。发生了什么变化?

这是我正在使用的代码。顺便一提。我尝试将它添加到我的 index.html 中,我还尝试将它用作单独的 php 文件并使用 INCLUDE 调用它,一切。似乎没有任何效果。

<?php

$open = fopen(“hits.txt”, “r+”);
$value = fgets($open);
$close = fclose($open);

$value++;

$open = fopen(“hits.txt”, “w+”);
fwrite($open, $value); // variable is not restated, bug fixed.
$close = fclose($open);

?>

然后我想在哪里显示结果,我有,

<?php echo $value; ?>

有什么想法吗?

【问题讨论】:

  • 将 index.html 重命名为 index.php。当包含在 .html 文件中时,服务器端代码可能不会被解析...
  • "I have downloaded script after script after script" - 但是您是否编写或理解了任何代码?它以何种方式无法按预期工作?如果最终结果不是您所期望的,请进行一些调试。代码是否正在运行?什么是运行时值?观察到的行为在什么时候偏离了预期的行为?
  • 双引号有问题:应该是"而不是
  • 我发现了问题所在。我不得不将 index.html 保存为 index.php。显然,它必须在 PHP 文件中才能工作。

标签: php hitcounter


【解决方案1】:

您可以将以下内容用作基本命中计数器:

$counter = file_get_contents('./file') + 1;
file_put_contents('./file', $counter);

您可能想要实施某种方式来检查它不仅仅是一个用户刷新页面...一些简单的事情,例如:

session_start();
if(empty($_SESSION['visited'])){
    $counter = file_get_contents('./file') + 1;
    file_put_contents('./file', $counter);
}

$_SESSION['visited'] = true;

将检查用户是否已经在同一个session 中访问过该站点,如果有,则不增加该值。

【讨论】:

  • 如果两个用户同时加载页面会怎样?
  • @ThoraciusAppotite 几乎没有;整个操作应该少于2 milliseconds。所以在同一时间发生这种情况的可能性几乎是0%。如果两个新用户设法在不到一毫秒的时间内访问该页面,那么最坏的情况是他们从文件中读取相同的数字(例如100)将其递增并写入背部。 IE。当您期望计数器为102 时,他们都会回信101
  • @ThoraciusAppotite 发生这种情况的可能性几乎微不足道;唯一真正的解决方法是将访问存储在数据库中,COUNT 访问...
  • 在大多数情况下,点击计数器只是为了好玩,但准确性至关重要(例如“第 100 万访问者获得奖品”)可以实现文件锁定。
  • @ThoraciusAppotite 这确实是一种解决方法。但是,在我希望在一毫秒内多次点击的情况下,我不确定我是否想用文件锁挂起服务器?数据库绝对是我要走的路(尤其是你的例子——因为这样任何关于准确性的问题都可以用数据来验证)
【解决方案2】:

您可以在 PHP 中创建一个 ajax 文件,并在一个时间间隔内调用 ajax 并将点击计数器显示到页面。

为此首先创建一个ajax文件:ajax_user_count.php

<?php
session_start();
$log_file_name = 'traffic_count.log';
$count = file_get_contents($log_file_name, true);
if(empty($count)){$count = 0;}  
if(isset($_POST['action'])){
    $action = $_POST['action'];
    if($action == 'enter'){
        if(!isset($_SESSION['user_count'])){
            $count += 1;
            if($count == 0) { $count = 1; }
            $_SESSION['user_count'] = $count;
            $message = $count; 
            file_put_contents($log_file_name, $message);        
        }
    } else if($action == 'leave'){
        $count -= 1;
        $_SESSION['user_count'] = $count;
        $message = $count; 
        file_put_contents($log_file_name, $message);
        session_destroy();  
    }
}

echo $count;
die;

然后通过这个调用ajax文件

$(document).ready(function(){
    get_enter_web_traffic();
    setInterval(function(){ 
        get_enter_web_traffic();
    }, 1000);
    $(window).bind("beforeunload", function() {
        $.ajax({
                type: "POST",
                async: false,
                cache: false,
                url: "ajax_user_count.php",
                data: {'action' : 'leave'},
                success: function(result) { },
                error: function(data) { location.reload(); 
            }
        });
    });     

});

function get_enter_web_traffic(){
    var data = {'action' : 'enter'};    
    $.post('ajax_user_count.php',data,function(response){
        $('#count_user').html(response); // website hit count
    }); 
}

【讨论】:

    【解决方案3】:

    我目前正在学习 PHP。想出了这个易于实现的计数器。看看吧

    <?php 
    
    $filename = "count.txt";// the text file to store count
    // Open the file foe reading current count
    $fp = fopen($filename, 'r');
    
    //Get exiting count
    $count = fread($fp, filesize($filename));
    
    //close file
    fclose($fp);
    
    //Add 1 to the existing count
    $count = $count +1;
    
    //Display the number of hits
    echo "<p>Total amount of Hits:" . $count. "</p>";
    
    //Reopen to modify content
    $fp = fopen($filename, 'w');
    
    //write the new count to file
    fwrite($fp, $count);
    
    //close file
    fclose($fp);
    
    ?>
    

    希望这段代码对某人有用。

    【讨论】:

      【解决方案4】:
      file_put_contents('count.txt',"\n",FILE_APPEND|LOCK_EX);
      $count = filesize("count.txt"); 
      

      它将一个字节附加到文件并读取文件大小作为计数器。 这是我在 0.1 毫秒内发现的最快且无错误的逻辑

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2011-07-31
        • 1970-01-01
        相关资源
        最近更新 更多