该方法简单实现了一直以来被广泛论讨、较难实现论坛实时在线用户统计的问题。
现在此简述一下原理。
首先建一文件夹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/