我设法在15分钟不活动后获取查询以更新数据库并注销用户。但是当用户登录并关闭浏览器时,他们将在下次登录网站时才会被注销。我怎么能这样做,即使他们关闭浏览器,数据库仍然会以某种方式更新?
// log out the user after 60 seconds of inactivity
if (isset($_SESSION['timestamp'])) {
$elapsed_time = time() - $_SESSION['timestamp'];
if ($elapsed_time >= 900) {
mysql_query("UPDATE `users` SET `status` = '0' WHERE `user_id` = '$session_user_id'");
session_destroy();
header('Location:index.php');
}
}
$_SESSION['timestamp'] = time();
此时,如果用户登录并关闭浏览器,它们将显示为永久登录
答案 0 :(得分:1)
Marc B建议您应该"在您的系统上运行预定的工作,以退出任何闲置时间超过设定时间的人员#34; - 但是,当会话处理程序中的垃圾收集执行时,这没有什么不同。
我同意Sverri的说法,当你需要追踪用户的最后一项活动时,你不应该使用一个单独的状态变量。
如果是我,我会在会话管理器层实现逻辑 - 并拒绝加载过期的会话。
答案 1 :(得分:0)
您可以更新用户的活动,只需使用上一个时间戳。你也可以运行一个会更新它的工人
答案 2 :(得分:0)
执行onUnload脚本
一种选择是每次卸载文档时执行JavaScript:
<body onunload="ajaxDoLogoff()">
与
function ajaxDoLogoff() {
xmlhttp.open( "GET", "performLogoff.php", false );
xmlhttp.send();
}
跟踪用户的活动并使所有非活动用户无效
或者向保存unix时间戳的用户lastActivity INT(11)
添加字段table
。
如果用户登录或登录用户返回,请跟踪他的活动:
$query = 'UPDATE `users` '
. ' SET `status` = "1", '
. ' `lastActivity` = "' . $time() . '" '
. ' WHERE ( `userID` = "' . $userID . '" ) '
;
mysql_query( $query );
经常清理过时的会话:
$deadSessionTimestamp = time() - $thresholdInSeconds;
$query = 'UPDATE `users` '
. ' SET `status` = "0" '
. ' WHERE ( `lastActivity` < "' . $deadSessionTimestamp . '" ) '
;
mysql_query( $query );
副作用:应用程序现在跟踪每个用户的上一个活动。
奖励:显示登录操作的最后活动日期/时间
使用此查询
$query = 'SELECT `lastActivity ` '
. ' WHERE ( `userID` = "' . $userID . '" ) '
;
如果用户提交用户ID /密码,您可以告诉他上次登录的日期/时间。