Typecho 获取在线人数
在主题的functions.php
中加入
function onlinePeople() {
// 使用 Helper 类获取主题路径
$theme_dir = Helper::options()->themeFile(Helper::options()->theme);
$filename = $theme_dir . '/online.txt'; // 存储文件路径
$cookie_name = 'Typecho_Online_UID'; // Cookie名称
$timeout = 30; // 超时时间(秒)
try {
// 确保目录存在
if (!is_dir(dirname($filename))) {
if (!mkdir(dirname($filename), 0755, true)) {
throw new Exception("无法创建目录: " . dirname($filename));
}
}
// 读取当前在线用户数据
$online = file_exists($filename) ? file($filename) : array();
$now = time();
$active_users = array();
// 过滤超时用户
foreach ($online as $line) {
$parts = explode('|', trim($line));
if (count($parts) == 2 && ($now - $parts[1]) <= $timeout) {
$active_users[$parts[0]] = $parts[1];
}
}
// 生成或获取用户唯一标识(Cookie)
if (isset($_COOKIE[$cookie_name])) {
$uid = $_COOKIE[$cookie_name];
} else {
$vid = 0;
do {
$vid++;
$uid = 'U' . $vid;
} while (isset($active_users[$uid]));
setcookie($cookie_name, $uid, $now + 86400, '/'); // 24小时有效期
}
// 更新当前用户活跃时间
$active_users[$uid] = $now;
$online_count = count($active_users);
// 写入文件(原子操作)
$fp = fopen($filename, 'w');
if (!$fp || !flock($fp, LOCK_EX)) {
throw new Exception("无法锁定文件");
}
foreach ($active_users as $user => $time) {
fwrite($fp, "$user|$time\n");
}
flock($fp, LOCK_UN);
fclose($fp);
return $online_count;
} catch (Exception $e) {
error_log("在线人数统计错误: " . $e->getMessage());
return false;
}
}
在主题模板(如 footer.php)中直接调用:
<?php if ($count = onlinePeople()): ?>
<span><?php echo $count; ?>人在线</span>
<?php endif; ?>
0 条评论
暂无评论