1

如果用户在 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)

4

4 回答 4

7

不,您的 PHP 代码在每个请求上运行。如果您希望超时“立即”触发,那么您必须通过连续请求向服务器发送垃圾邮件(坏主意)或将超时逻辑移至客户端代码。

适当的解决方案可能是在页面加载时启动 Javascript 计时器,并在计时器到期时将用户重定向到注销页面。如果用户同时导航到另一个页面,当前计时器将被自动丢弃,并在该页面加载时启动一个新计时器。它可以像这样简单:

<script type="text/javascript">
    setTimeout(function() { window.location.href = "logout.php"; }, 60 * 10);
</script>

更新:当然,您还应该保留服务器端代码以在您自己的一方强制执行业务规则。当客户端合作时,Javascript将为您提供“最佳”方案;如果客户端对您不利,PHP 代码将为您提供保证。

于 2012-07-09T11:10:01.083 回答
0

你可以通过减去当前时间来做到这一点,比如 time(); 到你想要的时间。试试这个链接。

如何在 30 分钟后使 PHP 会话过期?

于 2012-07-09T11:15:53.750 回答
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 $!");
于 2012-07-09T12:09:32.387 回答
0

我会在页面的标题中包含一个元刷新,并检查自页面输出以来已经过了多长时间。一些简单的服务器端逻辑可以实现这一点。

于 2012-12-01T16:22:57.453 回答