牛骨文教育服务平台(让学习变的简单)
博文笔记

如何简单实现论坛实时在线用户统计

创建时间:2007-01-11 投稿人: 浏览次数:919

该方法简单实现了一直以来被广泛论讨、较难实现论坛实时在线用户统计的问题。

现在此简述一下原理。

首先建一文件夹tmp,用来储存session用户的SESS文件(正常情况下SESS文件是默认存在系统目录window下的tmp文件夹中);

然后声明:
session_save_path("tmp");
session_start();

function run_online(){
  //变量$title :是每一页面名字,即可做为用户所处的当前位置来用;
  //变量$web :一个预设的数组变量;
  global $web,$title;
  global $onliner_num;

  $_SESSION["locate"]=$title; //确立当前位置

  if(!$_SESSION["ip"] || $_SESSION["ip"]!=$web["ip"]){
    $_SESSION["ip"]=$web["ip"]; //确立用户IP写入SESS文件
  }

  session_write_close(); //关闭,以便SESS文件可读

  $onliner_num["guest"]=0; //初始过客在线人数
  $onliner_num["area"]=0; //初始当前版区在线人数

  $sess_file=@glob("tmp/*"); //遍历tmp文件夹下SESS文件,即开始统计用户量
  foreach($sess_file as $key=>$file){
    $file_contents=@file_get_contents($file);
    //如果是本人session_id()的、或是本人IP的、或已设置cookies时限,并到期的、或SESS文件大小为0(无效)的等等,则删除之:
    if($file!="tmp/sess_".session_id()
    && ((!strstr($file_contents,"timeover|") && ((time()-filemtime($file))>$web["stop_online_time"] || preg_match("/(ip/|s:/d+:/"".$web["ip"]."/";)|(user/|s:/d+:/"".$_SESSION["user"]."/";)/i",$file_contents))) || (preg_match("/timeover/|i:"(/d+)";/",$file_contents,$m) && time()>$m[1]) || filesize($file)==0)){
      @unlink($file);
      unset($sess_file[$key]);
      continue;
    }
    //如果未登录的,则过客数加1:
    if(!strstr($file_contents,"user|")){
      $onliner_num["guest"]++;
    }
    //如果SESS文件中的$_SESSION["locate"]与当前所处版区的参数符合,则目前该版区的人数加1
    if(strstr($file_contents,$_REQUEST["forum"]."/".$_REQUEST["area"])){
      $onliner_num["area"]++;
    }
    //在此还可进行其它项目在线人数的查询,如当前页面在线人数
  }

  $onliner_num["all"]=count($sess_file); //目前所有在线人数
  get_online_record($onliner_num["all"]); //这是另一个函数。用以在线人数超记录时,将在线记录写入数据库文件
}

//将此函数放置在每一个页面中,如footer之后,然后调用数组$onliner_num即可

 具体应用参见:http://www.162100.com/forum/


 

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。