您的位置:首页 > 其它

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

2007-01-11 22:03 609 查看
该方法简单实现了一直以来被广泛论讨、较难实现论坛实时在线用户统计的问题。

现在此简述一下原理。

首先建一文件夹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/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息