在php中如何检测用户是否已注销?

时间:2009-05-20 13:32:11

标签: php mysql session redirect logout

用户成功登录后,我将login = true存储在数据库中。但是如何在不单击注销按钮的情况下关闭浏览器来检查用户是否已注销?此外,如何将已停用10分钟的用户重定向到登录页面?

我正在使用php和mysql。任何帮助将不胜感激。

编辑: 对不起,如果我的问题不明确。我确实使用会话来存储它们是否已登录。但是,现在我想将信息存储在数据库中,以便我可以在其他页面上显示它们的状态。假设user1有3个朋友。当显示他的所有朋友时,user1想知道他的朋友是在线还是离线。这就是我要的。有什么建议吗?

12 个答案:

答案 0 :(得分:13)

2017年编辑:现在,您最好的选择是使用网页框来跟踪网页/网站上的状态。


您无法检测用户何时关闭浏览器或使用PHP浏览您的网站,并且这样做的JavaScript技术远非保证无用。

相反,您最好的选择是最有可能存储每个用户的上一个活动时间。

  • 在用户表格中沿“last_activity”行创建一个列。
  • 每当用户加载页面时,将其last_activity更新为当前时间。
  • 要获取在线用户列表,只需查询数据库中last_activity值超过10/20 /几分钟前的用户。

答案 1 :(得分:8)

存储用户每个活动的时间戳。当该时间超过10分钟时,请注销。

在PHP中,你可以这样做:

session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
    // initiate value
    $_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
    // last activity is more than 10 minutes ago
    session_destroy();
} else {
    // update last activity timestamp
    $_SESSION['LAST_ACTIVITY'] = time();
}

相反,可以在数据库上完成相同的操作。在那里,您甚至可以获得“当前”在线的用户列表。

答案 2 :(得分:2)

您想知道是否可以检测用户是否关闭了他的浏览器。你有点可以用javascript,但我不会依赖它(因为javascript很容易禁用)但你不能用PHP,因为PHP只在你请求页面时运行。不是在页面打开时。

为了安全起见,您应该跟踪用户的上一次活动,如果过了几分钟(5/10),则假设用户已离开。如果他再做一些事(例如6分钟后),那么他又回到了网上。

答案 3 :(得分:1)

如果您尝试跟踪“在线”用户,则可以考虑为单个用户使用会话,而不是在db中存储login = true以向您或其他人显示其状态,存储最后一个活动用户的时间。当您提取在线用户列表时,创建您的SQL查询以仅返回在过去10分钟内具有“last_activity”的用户。

答案 4 :(得分:0)

这是对ceejayoz'之前说过的内容的扩展。

让用户定期ping服务并告诉他们仍然登录。在会话中存储最后的ping时间。如果最后一次ping会话大于上述时间,则再次ping,以告知该用途仍然存在。

存储在数据库中收到ping的时间。如果收到的最后一次ping是> keeplive阈值然后考虑用户已离开网站。

以下是一些未经测试的示例代码。您可以使用“PING__FREQUENCY”来控制用户活动更新last_activity列的频率。

define(PING_FREQUENCY,300); //5 mins
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) {
    stillLoggedIn(); //execute a function to tell that the user is still logged in
}

function stillLoggedIn() {
    //Do SQL update to mark the last activity time for the user
}

答案 5 :(得分:0)

恕我直言,最好的方法是在每次更新用户记录时在DB中存储最后一个活动时间戳。注销或超时后(使用cronjob维护超时)只需将其设置为零值并用作标记。

$user = new User($user_id);
$user->logged_in = (bool)($last_activity > 0);

有时你需要说smth。比如“上次见过...”,然后留下最后一个活动,只需在你的用户表中添加一个布尔标志(tinyint)logged_in。

答案 6 :(得分:0)

在会话变量中存储login = true可能更好,以检查用户是否已登录。这将解决您的大多数问题;)

答案 7 :(得分:0)

你可以通过多种方式组合实现这一点,最多2个猜测,最后一个活动困扰一个,你将它与使用jQuery结合起来检查是否不活动,一段时间内没有鼠标或键盘事件,说大约10到20分钟,然后一旦确认空闲时间,你对一个php文件进行ajax调用,该文件将更新你的数据库表,显示用户离线。

您可以从:

开始
<script type="text/javascript">
idleTime = 0;
$(document).ready(function () {
//Increment the idle time counter every minute.
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

//Zero the idle timer on mouse movement.
$(this).mousemove(function (e) {
    idleTime = 0;
});
$(this).keypress(function (e) {
    idleTime = 0;
});
});

function timerIncrement() {
idleTime = idleTime + 1;
if (idleTime > 19) { // 20 minutes
    $.ajax({
     url: 'update_user.php',
     type: 'POST',
     datatype: 'json',
     data: someData
    });
}
}
</script>   

答案 8 :(得分:0)

通常你会在会议中提供这些信息。

$_SESSION['user'] = "A user name";

然后,当您要退出时,请执行以下操作:

session_destroy();

有关会话heretutorial的更多信息。

答案 9 :(得分:0)

为什么不使用会话或cookie而不是将其插入数据库中。 您可以使用setcookie()函数设置cookie,或者您可以将会话变为可用并将值存储在其中。

答案 10 :(得分:0)

您会发现使用会话监控登录状态会更好。

Read this information about sessions

答案 11 :(得分:0)

AFAIK无法检查某个人关闭浏览器窗口的时间(或让您的页面转到另一个窗口),因此您需要像上面建议的那样检查活动。