在页面不活动 30 秒后自动刷新页面并在 php 中销毁会话,无需任何用户交互?

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

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

  <?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) 调用页面向用户显示某种错误/消息,说明他们已超时

如果你想在真正的用户不活动后超时,你需要这个:Detecting idle time in JavaScript elegantly,但我不相信这些解决方案 100% 万无一失(例如,它们会在移动设备上完全崩溃)

现在 - 如果你想使用上面的 link - 你将需要 ajax - 因为你当前的代码将不起作用 - 基本上(我不会给你写一个 AJAX 教程在这里) - 你需要使用 javascript 来计算你的超时时间(使用上面的 SO link)然后点击服务器并告诉它使会话无效(阅读这个更多信息教程http://www.w3schools.com/ajax/)

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