Typecho 常用实现方法之统计在线人数

小助手读文章 00:00 / 00:00

继建站系列后,根据一年多来主题的开发经验,打算写一些关于 Typecho 的技巧方法,供后来者参考,今天就来说说本站主题(ArmxMod for Typecho)侧栏当前在线人数统计功能的实现方法。

分析

既然是统计,那么必然需要有地方去记录访问信息,要么通过写数据库记录,要么通过写文件记录,考虑到在线人数并不是非常必要的信息,而读写数据库性能比直接写文件也差了很多,因此没必要记录到数据库,直接写文件效率更高。

访问网站,一般都带有 IP、浏览器、请求方式、请求链接、请求时间等等参数,如何有效率地相对准确地实现统计是一个需要思考的问题。参与统计的参数越多,相对地自然就会更准确,但相应的效率就很低下,参与统计的参数少,又无法保证准确率。

思来想去,决定使用唯一 Cookie 来判断,每位用户访问时自动生成一个 Cookie,记录访问时间,并设定一定时间后 Cookie 自动失效,然后用户在看在线人数时,就显示有效时间内的有效 Cookie 有多少个,这样既保证相对准确又实现了统计功能。

实现

直接上代码:

由于主机参数区别,不能直接复制粘贴使用,大家更应该学习的是思路方法。

function getOnline(){
$filename = $_SERVER['DOCUMENT_ROOT'].'/'.parse_url($base_dir,PHP_URL_PATH).'online.txt';  //文件保存在哪里
$cookiename = '_armxmod_online';  //Cookie 要叫什么名
$onlinetime = 600; //Cookie 多长时间失效 

$online = file($filename);
$nowtime =$_SERVER['REQUEST_TIME'];
$nowonline = array();
foreach($online as $line){
 $row=explode('|',$line);
 $sesstime=trim($row[1]);
 if(($nowtime - $sesstime)<=$onlinetime){
  $nowonline[$row[0]]=$sesstime;
 }
}

if(Typecho_Cookie::get($cookiename)){
  $uid=Typecho_Cookie::get($cookiename);
}else{
 $vid=0;
 do{
  $vid++;
  $uid='U'.$vid;
  }
 while(array_key_exists($uid,$nowonline));
  Typecho_Cookie::set($cookiename,$uid);
}

$nowonline[$uid]=$nowtime;
$total_online=count($nowonline);
if($fp=fopen($filename,'w')){
    if(flock($fp,LOCK_EX)){
        rewind($fp);
        foreach($nowonline as $fuid=>$ftime){
            $fline=$fuid.'|'.$ftime."\n";
            fwrite($fp,$fline);
        }
        flock($fp,LOCK_UN);
        fclose($fp);
    }
}
 echo $total_online;
}

效果

到这里已经可以实现在线人数的统计了,接下来就是前端的显示了。在想要显示在线人数的地方添加:

<?php getOnline();?>

就可以了,是不是很有趣,赶紧试试吧!


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 php教程typecho方法统计在线人数 的文章

 本文最后更新于 2019/04/21 10:57:06,可能因经年累月而与现状有所差异

 引用转载请注明:VirCloud's Blog > Typecho > Typecho 常用实现方法之统计在线人数

精选评论

  1. 枫叶

    刚才我在我博客更新了一篇水文,发现那个用了你主题最后更新代码的地方居然动了下时间,但是我不知道这个最后更新时间到底是获取的什么,是最新发文章的时间,还是说登录后台的时间。编辑文章的时候它好像没有变动。看来现在还是给这个难题先放一放,后期关注你文章看看再解决吧,毕竟不是专门写代码的。 icon_neutral.gif

    1. 欧文斯

      最后更新是看文章发表时间和更新时间,一般来说都会有值的

  2. 枫叶

    我找了两天的那个博客最后更新时间的代码,下载了你的主题好像扒下来也没生效。 icon_confused.gif 头疼~

    1. 欧文斯

      要研究实现方法,而不是直接扒,环境不一样,代码肯定会有变动的 icon_lol.gif ,后续我会再更新 Typecho 常用实现方法 系列,可以关注下。

      1. 枫叶

        心疼2019,居然还要环境。我里个天。。。那好吧,我就接着关注博主你的文章。求解决方法~另外想说下你这个评论下面的表情包被footer挡住了,还有就是你居然没有评论邮件提醒啊。不科学啊

        1. 欧文斯

          找了几个邮件通知的插件都用不了就放弃了。我看看表情问题,感谢反馈 icon_mrgreen.gif