在页面处于非活动状态 30 秒后自动刷新页面并销毁 php 中的会话,无需任何用户交互


Automatic refresh page and destroy session in php after 30 seconds of page inactivity, without any user interaction?

当用户在页面不活动 30 秒后按刷新时,此代码可以完美运行,但我需要一些代码来自动销毁 sassion 并在 30 秒不活动后刷新页面。

  <?php
    $inactive = 30;
    ini_set('session.gc_maxlifetime', $inactive);
    session_start();
    if (isset($_SESSION['testing']) && time() - $_SESSION['testing'] > $inactive) {
        session_unset();     // unset $_SESSION variable for this page
        session_destroy();   // destroy session data
     echo "<br><br>Sorry, you can't go any further!!!";
     echo "<br>Please log in.";
     echo "<br/><a href='index.php'>Go back to login page</a>";
    }else{
    //Here is some code to do when the session is still active
    }
    $_SESSION['testing'] = time();
    ?>

几种方法可以解决此问题,具体取决于您希望如何通知用户 - 如果您只是希望在时间到期后重新加载页面 - 这将起作用:

<meta http-equiv="refresh" content="30" >

如果放在页面的 head 标签中 - 基本上这会导致页面在 30 秒后刷新 - 这将导致您的 PHP 代码再次执行,这将产生您想要的效果。

如果你想要更好的用户体验 - 即不让页面刷新,而是给用户某种警告/提示,提示某些东西即将过期 - 你需要使用javascript - 这样的东西会起作用(在你的页面上的脚本标签内):

setTimeout(runAfterThirty, 30000);
function runAfterThirty() {
    alert("Your session expired - I am going to refresh the page now");
    location.reload(); 
}

在你的函数中,你可以放置任何你想要的东西 - 你很可能想要一些改变页面而不是刷新页面的东西。

无论哪种方式,页面都会由javascript刷新,这意味着您的PHP代码可以执行。您应该使用 PHP 销毁会话。

如果您愿意,您可以稍微不同地实现这一点 - 通过调用 AJAX 请求,该请求将到达旨在销毁会话的页面 - 无论它看起来像什么,根据您的代码 - 这是不需要的 - 但是使用 AJAX 的方法意味着用户的页面不需要刷新 - 逻辑如下所示:

1)该页面有一些javascript代码,在时间限制到期后调用一个函数(见上面的代码) - 然后该函数向另一个页面发出AJAX请求2)另一个页面使php会话无效3)调用页面向用户显示某种错误/消息,指出他们已超时

但是,如果您想在真正的用户不活动后超时,则需要以下内容: 优雅地检测 JavaScript 中的空闲时间,但我不相信这些解决方案是 100% 万无一失的(例如,它们会在移动设备上完全中断)

现在 - 如果你想使用上面的链接 -

你将需要 ajax - 因为你当前的代码将不起作用 - 基本上(我不会在这里给你写一个 AJAX 教程) - 你需要使用 javascript 来解决何时达到超时(使用上面的 SO 链接)然后点击服务器并告诉它使会话无效(阅读本教程以获取更多信息 http://www.w3schools.com/ajax/)

请注意,您需要决定当用户不通过 ajax 使会话无效但刷新页面时该怎么做 - 也就是说,用户可以阻止来自其浏览器的所有 ajax 请求 - 这意味着他们永远不会使会话自我失效,即使它们处于非活动状态 - 但是您可能希望服务器在 3 分钟后使会话超时或其他什么? 这都是应用程序设计的东西。