如果浏览器关闭,PHP Autologout功能无法正常工作

时间:2017-01-17 09:53:01

标签: php

我知道已经提出了类似的问题,但似乎都没有一个好的解决方案。我有一个自动注销功能(见下文)。

但是,如果选项卡/浏览器关闭,会话永远不会被销毁,更重要的是数据库表tblTimeLog不会更新。

我想做的是让"计时器继续运行"即使浏览器或标签已关闭。有关如何实现这一目标的任何建议吗?

自动退出功能:

<?
session_start();

// set timeout period in seconds
$idleTime = 2400;
header("refresh: 2400");

// check to see if $_SESSION['timeout'] is set
if(isset($_SESSION['timeout']) ) {
    $session_life = time() - $_SESSION['timeout'];
    if($session_life > $idleTime) { 
        $db->Execute("UPDATE tblTimeLog SET LogoutTime = NOW() WHERE sid ='".session_id()."'".$row['konsulentid'].'');
        session_destroy(); 
        header("Location: login.php?loggut");
        exit(); 
    }
}
$_SESSION['timeout'] = time(); 
?>

2 个答案:

答案 0 :(得分:0)

IMO一个合理的解决方案是让一个cron作业定期遍历tblTimeLog表中的所有会话,并在发生超时时更新表的LogoutTime。下次,如果具有由cron脚本注销的会话ID的客户端再次连接,则会销毁会话cookie。这只需要在DB会话到期时间内存储。

答案 1 :(得分:0)

您的问题是自动注销仅在请求服务器时生效。

您希望系统记录用户,无论他们是否仍在发送

一个简单的解决方案是设置a cron job每分钟调用一次PHP脚本。让脚本循环遍历所有用户,并在必要时将其注销。这将要求您额外存储他们在数据库中最后一次发出请求的时间,因为它当前存储在您不能在其他脚本中访问的会话中。

或者,在成功(登录)请求中,您可以安排脚本以将用户注销。在每个后续请求中,取消该计划执行并安排另一个请求。

您选择哪种解决方案取决于您的确切系统。权衡每个人的利弊。例如,第一个可能不合适,因为无论是否有人实际登录,它都会一直运行。