代码 1 0

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