如何检测用户不在线?

4

我有一个由PHP编写的管理员仪表板。
现在,我想知道我的在线用户。因此,在数据库中创建了一个名为“ONLINE”的表。当访问者/用户访问我的网站时,它的IP会保存在我的数据库中,并在仪表板上显示1个在线用户

问题从这里开始。我希望当一个访问者/用户离开我的网站(关闭网站、关闭选项卡和整个浏览器)时,他的保存的IP(在ONLINE表中)能够迁移到数据库中的另一个名为“VISITORS”的表中。


1
问题在于你不知道如何将数据从一张表格发送到另一张表格,还是不知道如何确定用户是否已经离开? - Daniel Nielson
我知道如何将数据从一个表格转移到另一个表格,但我不知道“如何确定用户已离开”。 - MHK
你不能通过跟踪IP地址来实现这一点,你需要一个自定义的会话处理程序来跟踪明确终止的会话和超时的会话。 - pvg
我认为你所需要做的就是跟踪你拥有的活动会话数量,不必担心存储IP地址。 - Burhan Khalid
我在我的网站上没有注册和登录功能,您可以查看@ http://www.mhk.me。 - MHK
@MHK,你不需要登录或注册功能来跟踪会话。IP地址无法准确地跟踪用户,你将没有合理的方法来跟踪用户何时停止使用你的网站。我认为这个问题的根本答案是“你应该熟悉HTTP会话处理和PHP的相关功能”。 - pvg
3个回答

2

检测用户退出有些模糊。您可以使用JavaScript向服务器发送退出通知,例如:

window.onbeforeunload = function() {
   ... insert your ajax code here ...
}

有很多情况下上述代码并不会触发,因此更好的方法是使用签入(check-in)代码。您可以编写一个 PHP 脚本来插入/更新在线表(假设您的表中 IP 字段已设置为 UNIQUE 或 PRIMARY 键,并需要在表上创建一个 TIMESTAMP 字段 - 我将其命名为 last_check_in):

<?php
... connect to database ...
$statement = $db->prepare("INSERT INTO `ONLINE` SET `IP` = ?, `last_check_in` = NOW() ON DUPLICATE KEY UPDATE `last_check_in` = NOW()");
$statement->execute([$_SERVER['REMOTE_ADDR']]);

然后你可以在定时器上放置一个ajax调用(这是jquery的ajax页面:http://api.jquery.com/jquery.ajax/),并且你可以在回调函数中使用setTimeout来安排下一次更新。

然后你可以更改显示在线用户的查询,只显示最近检查过的用户:

<YOUR QUERY> WHERE <your WHERE stuff> AND `last_checkin` > NOW() - INTERVAL 1 MINUTE

实际上,这将允许您只使用一个表而不是两个,但如果您坚持使用两个表,您可以编写另一个脚本,将没有签到的用户移动到另一个表,并将其放在cron计时器上。


昨晚我脑子都快炸了!我不知道该怎么做。如果你能帮我写一个脚本,我会非常感激的。 - MHK

1

使用一个名为"VISITORS"的表格。 例如:时间段为1小时。 添加字段:

  • FirstActivityInHour (DateTime,TimeStamp或Int(分钟部分))
  • LastActivityInHour (DateTime,TimeStamp或Int(分钟部分))

如果访客离开网站-您无法跟踪此操作,即没有任何动作。 您可以跟踪上一次活动。

如果LastActivityInHour接近当前时间-访客在线。 非最优查询示例(FirstActivityInHour,LastActivityInHour- DateTime):

SELECT ...
    FROM "Visitors"
WHERE
    LastActivityInHour > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
    AND
    DATE_ADD(FirstActivityInHour, INTERVAL 1 HOUR) > NOW();

1
因此,要“确定用户是否离开”,您需要存储某种最后活动时间戳,并确定您认为“活动”的阈值时间段。这可以是30分钟、15分钟或1小时;这取决于您。

您可以通过使用MySQL处理会话一举实现两个目标。每当创建或更新会话时,您还可以存储IP地址和更新会话时的时间戳。如果用户注销,将调用session_destroy(),它将在您的会话处理程序中调用destroy(),在那里您可以将IP“移动”到非登录用户表中。使用自定义会话处理程序为您提供了一个直接放置所有逻辑的地方。


为了成为一个完整的解决方案,它还需要跟踪过期会话 - 问题特别提到了那些仅仅关闭浏览器的用户。 - pvg
阈值概念有很多优点。与永久会话概念和模糊退出相比,它们是巫术。+1 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接