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; ?>

浪子

Typecho代码,教程,Typecho模板,Typecho插件

0 条评论

暂无评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注