1

所以我试图有一个表格来显示哪些用户在我的网站上在线除了如果有人在没有先注销的情况下关闭网站的部分之外,我还可以正常工作我能做到的最好的。

在我的数据库中,我在该表中有一个用户表,online当您登录时,您的online状态设置为 1,当您单击注销时online设置为 0。这是我尝试使用的代码,如果有人在 10 分钟内不活动,他们将注销(online设置为 0)

<?php
session_start();
$timeout = 10; // Set timeout minutes
$logout_redirect_url = "logout.php"; // Set logout URL

$timeout = $timeout * 60; // Converts minutes to seconds
if (isset($_SESSION['last_activity'])) {
    $elapsed_time = time() - $_SESSION['last_activity'];
    if ($elapsed_time >= $timeout) {
        mysql_query("UPDATE users SET online = 0 WHERE username = '".$_SESSION['username']."'")
        or die(mysql_error());
        session_destroy();
        header("Location: $logout_redirect_url");
    }
}
$_SESSION['last_activity'] = time();
?>

这很好用,如果他们等待 10 分钟,它会将它们注销,但如果他们只是关闭浏览器,它会保持online= 1,将它们显示在列表中。

我认为问题在于,当他们关闭浏览器时会破坏会话,然后才有机会更新用户online并将其设置为 0

有没有办法解决?非常感谢您的帮助谢谢:)

顺便说一句,我知道不再使用 mysql 和一切,一旦我了解更多并首先让一切正常工作,我将尝试切换到其他东西。

4

1 回答 1

1

潜在的问题是,当用户关闭浏览器时,没有可靠的方式首先与您的服务器通信。[有些事情你可以尝试,但在我看来这是一个你不应该陷入困境的兔子洞] 你真正“知道”的是用户最近访问你的网站的时间。(在你的情况下$_SESSION['last_activity'])。

在基本层面上,您将希望开始将这些信息持久保存在您的数据库中,然后偶尔启动一个进程来清理过时的会话。

例如

//On page load with a logged-in user
mysql_query("UPDATE `users`
             SET `last_activity` = '" . time() . "' 
             WHERE `username` = '" . mysql_real_escape_string($_SESSION['username']) . "'");

请注意,假设您已将一INT列添加到名为last_activity

然后在每 15 分钟执行一次的进程中:

mysql_query("UPDATE `users` 
             SET `online` = 0 
             WHERE `last_activity` < '" . strtotime('-30 minutes') . "'");

Unix 服务器有一个叫做cron的东西,特别是用于周期任务/脚本,所以这就是我推荐的启动清理脚本的方法。

于 2013-01-06T04:56:33.027 回答