Mar*_*tic 1 php session page-refresh
当用户在页面不活动 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();
?>
Run Code Online (Sandbox Code Playgroud)
有几种方法可以解决此问题,具体取决于您希望如何通知用户 - 如果您只是希望在时间到期后重新加载页面 - 这将起作用:
<meta http-equiv="refresh" content="30" >
Run Code Online (Sandbox Code Playgroud)
如果放在页面的 head 标签中 - 基本上这将导致页面在 30 秒后刷新 - 这将导致你的 PHP 代码再次执行,这将产生你想要的效果。
如果你想要更好的用户体验 - 即不让页面只是刷新,而是给用户某种警告/提示,某些内容即将过期 - 你需要使用 javascript - 像这样的东西会起作用(在脚本标签内)您的页面):
setTimeout(runAfterThirty, 30000);
function runAfterThirty() {
alert("Your session expired - I am going to refresh the page now");
location.reload();
}
Run Code Online (Sandbox Code Playgroud)
在你的函数内部,你可以放置任何你想要的东西 - 你很可能想要改变页面而不是刷新页面的东西。
无论哪种方式,页面都会由 JavaScript 刷新,这意味着您的 PHP 代码可以执行。您应该用 PHP 销毁会话。
如果您愿意,您可以稍微不同地实现这一点 - 通过调用 AJAX 请求,该请求将命中旨在销毁会话的页面 - 但它看起来像,基于您的代码 - 这是不需要的 - 但是使用 AJAX 的方法会意味着用户的页面不需要刷新 - 逻辑如下:
1) 该页面有一些 javascript 代码,在时间限制到期后调用一个函数(参见上面的代码) - 该函数然后向另一个页面发出 AJAX 请求 2) 另一个页面使 php 会话无效 3) 调用页面显示向用户发出某种错误/消息,表明他们已超时
然而,如果你想在真正的用户不活动后超时,你需要这个:DetectingidletimeinJavaScriptgracely,但是我不相信这些解决方案是100%万无一失的(例如,它们在移动设备上会完全崩溃)
现在 - 如果你想使用上面的链接 - 你将需要 ajax - 因为你当前的代码将无法工作 - 基本上(我不会在这里给你写一个 AJAX 教程) - 你需要使用 javascript 来解决你的问题达到超时(使用上面的SO链接)然后点击服务器并告诉它使会话无效(阅读本教程以获取更多信息http://www.w3schools.com/ajax/)
请注意,您需要决定当用户不通过 ajax 使会话无效而是刷新页面时该怎么办 - 也就是说,用户可以阻止来自其浏览器的所有 ajax 请求 - 这意味着他们甚至不会自行使会话无效如果它们处于非活动状态 - 但是您可能希望服务器在 3 分钟或其他时间后使会话超时?这就是应用程序设计的全部内容。