效果预览

添加此功能后,您可以在博客侧边栏或页脚等位置实时显示当前网站的在线访客数量,如下图所示:

效果预览

实现步骤

步骤一:添加统计函数代码

默认主题:/usr/themes/default/functions.php

Handsome主题:/usr/themes/handsome/functions.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
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 在线人数统计函数
*/
function online_users() {
// 基本配置参数
$filename = 'online.txt'; // 数据文件路径,默认在网站根目录
$cookiename = 'Typecho_Online'; // Cookie名称,用于标识访客
$onlinetime = 30; // 在线有效时间(秒),超过此时间未活动则视为离线

// 读取在线用户数据文件
$online = file_exists($filename) ? file($filename) : array();
$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;
}
}

// 处理当前访客的Cookie
if(isset($_COOKIE[$cookiename])) {
// 已有Cookie,获取访客ID
$uid = $_COOKIE[$cookiename];
} else {
// 无Cookie,生成新的唯一访客ID
$vid = 0;
do {
$vid++;
$uid = 'U'.$vid;
} while(array_key_exists($uid, $nowonline));

// 设置Cookie,默认会话期有效
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);
}

return $total_online;
}

步骤二:在模板中显示在线人数

通用方法(适用于任何位置)

在需要显示在线人数的模板文件中,添加以下代码:

1
2
3
<div class="online-users">
当前在线: <?php echo online_users(); ?> 人
</div>

Handsome主题侧边栏添加方法

编辑文件:/usr/themes/handsome/component/sidebar.php

在适当位置(如”统计信息”部分)添加:

1
2
3
4
5
<li class="list-group-item"><div class="text-second">
<span class="blog-info-icons">
<i data-feather="user"></i></span>
<span class="badge pull-right"><?php echo online_users() ?>
</span><?php _me("在线人数") ?></li>

位置

页脚添加方法

编辑主题的footer.php文件,在合适位置添加:

1
2
3
4
<div class="site-info">
<!-- 其他页脚信息 -->
<span class="online-count">当前在线: <?php echo online_users(); ?> 人</span>
</div>