我知道已经提出了类似的问题,但似乎都没有一个好的解决方案。我有一个自动注销功能(见下文)。
但是,如果选项卡/浏览器关闭,会话永远不会被销毁,更重要的是数据库表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();
?>
答案 0 :(得分:0)
IMO一个合理的解决方案是让一个cron作业定期遍历tblTimeLog表中的所有会话,并在发生超时时更新表的LogoutTime。下次,如果具有由cron脚本注销的会话ID的客户端再次连接,则会销毁会话cookie。这只需要在DB会话到期时间内存储。
答案 1 :(得分:0)
您的问题是自动注销仅在请求服务器时生效。
您希望系统记录用户,无论他们是否仍在发送或 。
一个简单的解决方案是设置a cron job每分钟调用一次PHP脚本。让脚本循环遍历所有用户,并在必要时将其注销。这将要求您额外存储他们在数据库中最后一次发出请求的时间,因为它当前存储在您不能在其他脚本中访问的会话中。
或者,在成功(登录)请求中,您可以安排脚本以将用户注销。在每个后续请求中,取消该计划执行并安排另一个请求。
您选择哪种解决方案取决于您的确切系统。权衡每个人的利弊。例如,第一个可能不合适,因为无论是否有人实际登录,它都会一直运行。