我有这个代码,如果他们不在10分钟内更改页面,则会将用户注销。
$inactive = 600;
if(isset($_SESSION['timeout']) ) {
$session_life = time() - $_SESSION['timeout'];
if($session_life > $inactive) {
header("Location: logout.php");
}
}
$_SESSION['timeout'] = time();
正如你所看到的那样非常简单。我在所有受保护页面的顶部包含此功能,如果脚本未运行10分钟,则下次刷新页面时,用户将被发送到我的注销脚本。
然而这就是问题所在。在$ session_life>之后$ inactive变为true,需要再次运行脚本以便用户注销。一旦成为现实,我需要立即退出该人。
如果事情变得太复杂,有没有办法做到这一点? (即不使用AJAX)
答案 0 :(得分:6)
没有。您的PHP代码在每个请求上运行。如果您希望“立即”触发超时,则必须使用连续请求(错误的想法)向服务器发送垃圾邮件,或者将超时逻辑移至客户端代码。
一个合适的解决方案可能是在页面加载时启动Javascript计时器,并在计时器到期时将用户重定向到注销页面。如果用户在此期间导航到另一页面,则当前计时器将被自动丢弃,并且当该页面加载时启动新计时器。它可以这么简单:
<script type="text/javascript">
setTimeout(function() { window.location.href = "logout.php"; }, 60 * 10);
</script>
更新:当然,您还应该保留服务器端代码以自行执行业务规则。当客户端合作时,Javascript将为您提供“最佳”方案;如果客户端对您不利,PHP代码将为您提供保证。
答案 1 :(得分:0)
你可以通过减去当前时间来说明时间();到你想要的时间。 试试这个链接。
答案 2 :(得分:0)
我有一个想法,我测试过,它适用于我的服务器设置 - 它使用linux调用来设置延迟删除会话文件。这纯粹是服务器端,并在应该的时候准确地杀死会话。您必须具有运行shell命令的权限。
$inactive = 600;
# if there is a delayed removal - cancel it
if (isset($_SESSION['pid'])) shell_exec('kill -9 '.$_SESSION['pid']);
# compose path to session file
$sesspath = session_save_path().'/sess_'.session_id();
# set up a delayed removal to destroy the session after $inactive seconds and
# get its PID
#
# you can put whatever command you like inside the single quotes (call a logout
# php script perhaps?)
$_SESSION['pid'] = shell_exec("nohup sh -c 'sleep $inactive && rm $sesspath' > /dev/null & echo $!");
答案 3 :(得分:0)
我在页面标题中包含元刷新,并检查自页面输出以来的时间。一些简单的服务器端逻辑可以实现这一点。