You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AJAX的setInterval函数调用PHP函数实现实时在线用户数展示

很简单,咱们一步步来搞定这个无刷新显示在线用户数的需求:

1. 先处理后端接口

你的users_online()函数已经能正常工作了,现在需要把它改成可以通过AJAX调用的接口,避免返回页面其他HTML内容。这里有两种方案:

方案A:新建独立的接口文件

创建一个get_online_users.php文件,里面包含会话启动、数据库连接和你的在线用户统计函数,直接输出统计结果:

<?php
// 必须在输出任何内容前启动会话
session_start();
// 引入你的数据库连接配置(比如config.php,确保$con变量可用)
include 'config.php';

function users_online() {
    global $con;
    $session = session_id();
    $time = time();
    $time_out_in_seconds = 30;
    $time_out = $time - $time_out_in_seconds;
    
    // 补全你原有的SQL逻辑(这里是常规的在线用户统计流程)
    // 1. 清理超时的会话记录
    mysqli_query($con, "DELETE FROM users_online WHERE last_activity < $time_out");
    // 2. 更新或插入当前会话的活动时间
    $check_session = mysqli_query($con, "SELECT * FROM users_online WHERE session = '$session'");
    if(mysqli_num_rows($check_session) === 0) {
        mysqli_query($con, "INSERT INTO users_online(session, last_activity) VALUES('$session', '$time')");
    } else {
        mysqli_query($con, "UPDATE users_online SET last_activity = '$time' WHERE session = '$session'");
    }
    // 3. 统计在线用户总数
    $count_result = mysqli_query($con, "SELECT COUNT(*) AS user_count FROM users_online");
    $count_data = mysqli_fetch_assoc($count_result);
    return $count_data['user_count'];
}

// 直接输出统计数字,确保没有多余输出
echo users_online();
?>

方案B:在现有index.php中添加判断

如果不想新建文件,可以在index.php最开头添加判断,当收到AJAX请求时只返回统计结果:

<?php
session_start();
include 'config.php';

// 新增:判断是否是获取在线用户的AJAX请求
if(isset($_GET['fetch_online_users'])) {
    echo users_online();
    exit; // 终止后续页面输出
}

// 你的原有index.php代码继续...
function users_online() {
    // 你的原有函数代码...
}
?>
2. 前端AJAX实现

在你的页面中添加一个用于显示在线用户数的元素,比如:

<p>当前在线用户数:<span id="online-users">0</span></p>

然后添加JavaScript代码,实现每5秒无刷新更新数据:

// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
    const onlineUsersElement = document.getElementById('online-users');
    
    // 定义更新在线用户数的函数
    function refreshOnlineUsers() {
        const xhr = new XMLHttpRequest();
        // 如果你用方案A,这里填'get_online_users.php';方案B填'index.php?fetch_online_users=1'
        xhr.open('GET', 'get_online_users.php', true);
        
        xhr.onload = function() {
            if(this.status === 200) {
                // 更新页面上的数字
                onlineUsersElement.textContent = this.responseText;
            }
        };
        
        xhr.onerror = function() {
            // 请求出错时的提示
            onlineUsersElement.textContent = '加载失败';
        };
        
        xhr.send();
    }
    
    // 页面加载后先更新一次
    refreshOnlineUsers();
    // 每5秒自动刷新一次
    setInterval(refreshOnlineUsers, 5000);
});
3. 关键注意事项
  • 会话启动时机:所有用到session_id()的PHP文件都必须在输出任何HTML之前调用session_start(),否则会报错。
  • SQL注入防护:上面的示例用了简单的mysqli查询,建议改成预处理语句来避免注入风险,比如插入会话记录时:
    $stmt = mysqli_prepare($con, "INSERT INTO users_online(session, last_activity) VALUES(?, ?)");
    mysqli_stmt_bind_param($stmt, "si", $session, $time);
    mysqli_stmt_execute($stmt);
    
  • 超时时间调整:如果觉得30秒的超时太严格,可以根据需求修改$time_out_in_seconds的值。

内容的提问来源于stack exchange,提问作者Otto Fischer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:53