PHP会话超时脚本[重复]
Posted
技术标签:
【中文标题】PHP会话超时脚本[重复]【英文标题】:PHP session timeout script [duplicate] 【发布时间】:2012-07-08 18:43:58 【问题描述】:如果用户在 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)
【问题讨论】:
我不会在所有页面中复制该代码,而是将其包含在包含的头文件中……以防万一您需要更改$inactive
或其他逻辑。尽管就像其他人提到的那样,您可能仍需要将其移至客户端
它已经包含在头文件中了。
【参考方案1】:
没有。您的 PHP 代码在每个请求上运行。如果您希望“立即”触发超时,那么您必须向服务器发送连续请求的垃圾邮件(坏主意),或者将超时逻辑移至客户端代码。
适当的解决方案可能是在页面加载时启动 javascript 计时器,并在计时器到期时将用户重定向到注销页面。如果用户同时导航到另一个页面,当前计时器将被自动丢弃,并在该页面加载时启动一个新计时器。可以这么简单:
<script type="text/javascript">
setTimeout(function() window.location.href = "logout.php"; , 60 * 10);
</script>
更新:当然,您还应该保留服务器端代码以在您自己的一方执行业务规则。当客户端合作时,Javascript将为您提供“最佳”方案;如果客户端对您不利,PHP 代码将为您提供保证。
【讨论】:
或者在重定向之前销毁会话。 是的,这听起来是最合适的方法,乔恩。谢谢。 @Leigh:这并没有改变重定向仅在用户导航到 PHP 支持的 URL 后发生的事实。 OP 希望在 10 分钟后准确退出。 @Jon:我想我当时误解了这个问题。当然,注销确实会在 10 分钟后发生,只是用户在导航到新页面之前不会收到通知。 @Leigh:不,10 分钟后不会发生。如果您允许 20 分钟过去,然后将服务器时钟拨回 15 分钟,则不会退出。【参考方案2】:你可以通过减去当前时间来做到这一点,比如 time();到你想要的时间。 试试这个链接。
How do I expire a PHP session after 30 minutes?
【讨论】:
【参考方案3】:我有一个我测试过的想法,它适用于我的服务器设置 - 它使用 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 $!");
【讨论】:
【参考方案4】:我会在页面标题中包含元刷新,并检查自页面输出以来已经过了多长时间。一些简单的服务器端逻辑可以做到这一点。
【讨论】:
举一个 PHP 的“简单服务器端逻辑”的例子会很有帮助。以上是关于PHP会话超时脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章