继建站系列后,根据一年多来主题的开发经验,打算写一些关于 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();?>
就可以了,是不是很有趣,赶紧试试吧!
Windows 10Chrome 72.0.3626.121来自 福建省 的大神
我找了两天的那个博客最后更新时间的代码,下载了你的主题好像扒下来也没生效。 头疼~
要研究实现方法,而不是直接扒,环境不一样,代码肯定会有变动的 ,后续我会再更新 Typecho 常用实现方法 系列,可以关注下。
Windows 10Chrome 72.0.3626.121来自 福建 的大神
心疼2019,居然还要环境。我里个天。。。那好吧,我就接着关注博主你的文章。求解决方法~另外想说下你这个评论下面的表情包被footer挡住了,还有就是你居然没有评论邮件提醒啊。不科学啊
找了几个邮件通知的插件都用不了就放弃了。我看看表情问题,感谢反馈
Windows 10Chrome 72.0.3626.121来自 福建 的大神
刚才我在我博客更新了一篇水文,发现那个用了你主题最后更新代码的地方居然动了下时间,但是我不知道这个最后更新时间到底是获取的什么,是最新发文章的时间,还是说登录后台的时间。编辑文章的时候它好像没有变动。看来现在还是给这个难题先放一放,后期关注你文章看看再解决吧,毕竟不是专门写代码的。
最后更新是看文章发表时间和更新时间,一般来说都会有值的
Windows 7Chrome 97.0.4692.99来自 山东 的大神
怎么改动代码
主要修改 function.php