我有一个由PHP编写的管理员仪表板。
现在,我想知道我的在线用户。因此,在数据库中创建了一个名为“ONLINE”的表。当访问者/用户访问我的网站时,它的IP会保存在我的数据库中,并在仪表板上显示1个在线用户。
问题从这里开始。我希望当一个访问者/用户离开我的网站(关闭网站、关闭选项卡和整个浏览器)时,他的保存的IP(在ONLINE表中)能够迁移到数据库中的另一个名为“VISITORS”的表中。
我有一个由PHP编写的管理员仪表板。
现在,我想知道我的在线用户。因此,在数据库中创建了一个名为“ONLINE”的表。当访问者/用户访问我的网站时,它的IP会保存在我的数据库中,并在仪表板上显示1个在线用户。
问题从这里开始。我希望当一个访问者/用户离开我的网站(关闭网站、关闭选项卡和整个浏览器)时,他的保存的IP(在ONLINE表中)能够迁移到数据库中的另一个名为“VISITORS”的表中。
检测用户退出有些模糊。您可以使用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计时器上。
使用一个名为"VISITORS"的表格。 例如:时间段为1小时。 添加字段:
如果访客离开网站-您无法跟踪此操作,即没有任何动作。 您可以跟踪上一次活动。
如果LastActivityInHour接近当前时间-访客在线。 非最优查询示例(FirstActivityInHour,LastActivityInHour- DateTime):
SELECT ...
FROM "Visitors"
WHERE
LastActivityInHour > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
AND
DATE_ADD(FirstActivityInHour, INTERVAL 1 HOUR) > NOW();
您可以通过使用MySQL处理会话一举实现两个目标。每当创建或更新会话时,您还可以存储IP地址和更新会话时的时间戳。如果用户注销,将调用session_destroy()
,它将在您的会话处理程序中调用destroy()
,在那里您可以将IP“移动”到非登录用户表中。使用自定义会话处理程序为您提供了一个直接放置所有逻辑的地方。