这是一个非常精确的,通过php实现统计在线人数的方法,想知道怎么实现的请耐心阅读。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<?php
$filename = 'online.txt' ; //数据文件
$cookiename = 'VGOTCN_OnLineCount' ; //cookie名称
$onlinetime =600; //在线有效时间,单位:秒 (即600等于10分钟)
$online =file( $filename );
//PHP file() 函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false
$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 ; //获取在线列表到数组,会话ID为键名,最后通信时间为键值
}
}
/*
@创建访问者通信状态
使用cookie通信
COOKIE 将在关闭浏览器时失效,但如果不关闭浏览器,此 COOKIE 将一直有效,直到程序设置的在线时间超时
*/
if (isset( $_COOKIE [ $cookiename ])){ //如果有COOKIE即并非初次访问则不添加人数并更新通信时间
$uid = $_COOKIE [ $cookiename ];
} else { //如果没有COOKIE即是初次访问
$vid =0; //初始化访问者ID
do { //给用户一个新ID
$vid ++;
$uid = 'U' . $vid ;
} while ( array_key_exists ( $uid , $nowonline ));
setcookie( $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" ;
@ fputs ( $fp , $fline );
}
flock ( $fp ,LOCK_UN);
fclose( $fp );
}
}
echo 'document.write("' . $total_online . '");' ;
|
希望本文所述对大家学习php程序设计有所帮助。