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

原生PHP下如何检测用户非活跃状态?窗口关闭自动登出求助

原生PHP实现用户非活跃检测与窗口关闭自动登出

一、检测用户非活跃状态

用户非活跃状态需要前端+后端配合实现,毕竟PHP是服务端语言,无法直接感知前端用户的操作行为:

  • 前端监听交互事件:监听鼠标移动、键盘输入、页面点击等用户操作,每次触发时重置超时定时器,一旦超过设定时长无交互,就调用后端登出接口。
    示例代码:
    let inactivityTimer;
    // 重置非活跃定时器
    function resetInactivityTimer() {
      clearTimeout(inactivityTimer);
      // 1800000毫秒=30分钟,可根据需求调整时长
      inactivityTimer = setTimeout(logoutUser, 1800000);
    }
    
    // 绑定用户交互事件
    window.addEventListener('mousemove', resetInactivityTimer);
    window.addEventListener('keydown', resetInactivityTimer);
    window.addEventListener('click', resetInactivityTimer);
    
    // 调用后端登出接口
    function logoutUser() {
      fetch('logout.php', { method: 'POST' })
        .then(() => window.location.href = 'login.php');
    }
    
  • 后端处理登出逻辑(logout.php):
    session_start();
    session_unset();
    session_destroy();
    exit('已完成登出');
    
  • 后端额外校验:用户每次访问页面时,检查Session中记录的最后活跃时间,若超时直接跳转登录页
    session_start();
    $timeout = 1800; // 30分钟,单位秒
    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout) {
      session_unset();
      session_destroy();
      header('Location: login.php');
      exit;
    }
    // 更新最后活跃时间
    $_SESSION['last_activity'] = time();
    

二、解决窗口关闭自动登出的问题

你之前用window.addEventListener('beforeunload', logout)失败,大概率是因为异步请求还没完成,窗口就已经关闭了。可以用navigator.sendBeacon替代,它是浏览器专门为页面卸载场景设计的API,能保证请求在后台完成:

  • 前端代码:
    window.addEventListener('beforeunload', function() {
      // 发送登出请求
      navigator.sendBeacon('logout.php');
    });
    
  • 如果需要传递参数,可用FormData格式:
    window.addEventListener('beforeunload', function() {
      const formData = new FormData();
      formData.append('action', 'logout');
      navigator.sendBeacon('logout.php', formData);
    });
    
  • 额外优化:部分浏览器会在标签页切换时触发beforeunload,可以结合页面可见性API避免误登出:
    window.addEventListener('beforeunload', function() {
      if (document.visibilityState === 'hidden') {
        navigator.sendBeacon('logout.php');
      }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:52:09