【问题标题】:active users script, user count not working properly活动用户脚本,用户数无法正常工作
【发布时间】:2012-02-27 10:46:07
【问题描述】:

我已经编写了一个脚本来输出我网站上的活跃用户....

其中一部分是计算日志中的唯一 ips,因为我用来拆分行/数据的数组会在 5 分钟后从数组列表中卸载活动用户.....

但是“现在 3 个在线用户”计数无法正常工作.....

它有点工作....当有人查看一个页面时,它说有 1 个用户

假设我查看了一个页面.... 1 位访问者

然后用户 2 浏览了一个页面 .... 2 个访问者

但是如果我再查看另一个页面,它会显示 3 个用户.....

即使我对两个页面请求使用相同的 ip....

这是我的代码

$data = file_get_contents('active-log.txt');

$break = "\r\n";

$lines = explode($break, $data);

foreach ($lines as $key => $value) {

$active_ip[] = $lines[$key][1];

}

$active_ip_count = array_unique($active_ip);

$active_users = (count($active_ip_count));

$active_users 是我用来显示一次在线的唯一身份访问者数量的变量

提前感谢任何可以帮助我的人,谢谢

....

编辑

.....

这里是保存的日志示例......

 1328469393|157.55.39.84|g-book
 1328469398|157.55.39.84|downloads
 1328469400|157.55.39.84|badger
 1328469404|157.55.39.84|home
 1328469408|157.55.39.84|boneyard-dogs

第一部分是时间戳(从数组中删除行,如果时间戳早于 5 分钟......这工作正常)

第二部分是ip

第三部分是页面查看,新行是用 \r\n

创建的

$lines[$key][1] 是每行中每个ip的变量....

由于我不是一个 php 专家,所以在编写脚本时,我会在开发过程中对它们进行大量测试,并且每次添加新的脚本行时,我都会回显数据,以检查我希望的结果,以确保我做到了没有错误......

这是一段我没有粘贴的代码,因为我认为没有必要......

foreach($lines as $k=>$v) {

$lines[$k] = explode("|", $v); }

// echo $lines[0][0]; // now this is first array of first line .... line 2 / url would be - $lines[1][2]

这是在我的代码中,就在“$lines = explode($break, $data);”行之后在我的代码中

【问题讨论】:

    标签: php foreach flat-file


    【解决方案1】:

    foreach 循环结束后,您是否查看过var_dump($active_ip) 的输出?通过这种设置,我很确定 $lines[$key][1] 只是您正在处理的行的第一个字符,因此由于多种原因,它不会很好地工作。 active-log.txt 是什么样的?它是否也只包含 IP 地址或用户名?如果它只包含 IP 地址,请考虑使用以下内容:

    <?php
    $data = file('active-log.txt');
    $no_duplicate_ips = array_unique($data);
    $active_users = (count($no_duplicate_ips));
    ?>
    

    编辑:

    好吧,那是有道理的。试试这个:

    $data = file_get_contents('active-log.txt');
    $break = "\r\n"; //Note that it's generally a good idea to use PHP_EOL throughout your code, for greater cross-platform compatibility
    $lines = explode($break, $data);
    
    $exploded_data = array();
    $active_ips = array();
    
    foreach($lines as $v) {
        $exploded_data = explode("|", $v); 
        //Now check whether the timestamp is not > 5 min
        if(TIMESTAMP CHECK HERE) { 
             //OK, this one is not too old
             $active_ips[] = $exploded_data[1]; 
        }
    }
    
    $active_ip_count = array_unique($active_ip);
    $active_users = (count($active_ip_count));
    

    【讨论】:

    • 我不能只对完整的日志文件执行 array_unique(),因为如果时间超过 5 分钟,有一段代码可以从数组中删除日志行....仍在日志文件中,它只是从数组中取消设置,所以我需要计算位置 $lines[$key][1] 的 ips
    • 你知道我是否可以使用这样的声明吗? .... if("$var1 = $var2" || "$var3 = $var4") { 要执行的代码; }
    • 请参阅上面的解决方案,该解决方案可能比我刚刚在 cmets 中发布的解决方案更容易理解(这个解决方案太长了)。
    • 你必须使用类似 if($var1 == $var2 || $var3 == $var4) { code to be executed; } 因为 = 赋值, == 比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2016-05-20
    • 1970-01-01
    • 2014-12-07
    • 2015-04-04
    相关资源
    最近更新 更多