10

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

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

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

4

12 回答 12

13

2017 edit: These days, your best bet is using websockets to track presence on a page/site.


You cannot detect when a user closes their browser or navigates off your site with PHP, and the JavaScript techniques of doing so are so far from guaranteed as to be useless.

Instead, your best bet is most likely to store each user's last activity time.

  • Create a column in your user table along the lines of 'last_activity'.
  • Whenever a user loads a page, update their last_activity to the current time.
  • To get a list of who's online, just query the database for users with last_activity values more recent than 10/20/whatever minutes ago.
于 2009-05-20T13:50:39.487 回答
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();
}

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

于 2009-05-20T13:56:11.877 回答
2

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

为了安全起见,您应该跟踪用户的最后一次活动,如果已经过了几分钟(5/10),那么假设用户已经离开。如果他再次做某事(例如 6 分钟后),那么他就会重新上线。

于 2009-05-20T13:54:41.053 回答
1

如果您尝试跟踪“在线”用户,那么您可能会考虑为单个用户使用会话,而不是将 login=true 存储在数据库中以向您或其他人显示他们的状态,而是存储上次活动时间用户。当您拉出在线用户列表时,创建您的 sql 查询以仅在过去 10 分钟内返回具有“last_activity”的用户。

于 2009-05-20T13:51:52.137 回答
0

Normally you would put such information in sessions.

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

Then when you want to logout you do:

session_destroy();

Some more info on sessions here and a tutorial.

于 2009-05-20T13:35:15.260 回答
0

Why dont you use session or cookies for this instead of inserting it in the database. You can set the cookies by using setcookie() function or either you can make a session vaiable and store the value in it.

于 2009-05-20T13:36:09.953 回答
0

You would find it better to use the session to monitor the login status.

Read this information about sessions

于 2009-05-20T13:36:42.073 回答
0

AFAIK 您无法检查某人何时关闭浏览器窗口(或离开您的页面转到另一个页面),因此您需要按照上面其他人的建议检查活动。

于 2009-05-20T13:54:10.213 回答
0

最好将 login=true 存储在会话变量中以检查用户是否登录。这将解决您的大部分问题;)

于 2009-05-20T13:33:36.183 回答
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
}
于 2009-05-20T16:10:22.420 回答
0

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

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

有时你需要说 smth。就像“最后一次看到...”,然后离开最后一个活动,只需在您的用户表中添加一个布尔标志(tinyint)logged_in。

于 2009-05-20T16:23:56.743 回答
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>   
于 2014-06-22T13:45:27.463 回答