如何在他们离开页面或退出之前添加一个显示哪些用户在线的区域?
我考虑制作一个能够保持用户会话的表,直到他们离开页面,但我怎么能告诉他们什么时候离开?我只需要每5秒更新一次。我想在Windows的情况下远离cron作业,(Windows不支持cron吗?)
感谢您的帮助
答案 0 :(得分:0)
前段时间我在其中一个应用程序中做了类似的事情。将Ajax调用绑定到某些事件,如click或mousemove。在该调用中,将时间戳写入active_users表。编写另一个函数来查询此表,并选择时间戳大于5分钟的用户。也可以通过Ajax在特定的时间间隔或者在事件中进行调用。
答案 1 :(得分:0)
有很多可能的解决方案,如果你想要代码,你应该为你的实现发布一些代码。
作为一个整体设计问题,您可能需要一种方法来存储有多少用户在线(更多关于检测以下内容)在内存(后端服务,内存数据库,如redis或memcached)或磁盘(常规数据库)上)。
至于检测用户何时在线,这可能是一个相当困难的问题,但假设精确到第二个数字并不重要,你可以增加数字(在数据库或内存中从上面)当您提供页面(PHP)或用户加载页面(Javascript)时。
至于检测用户何时导航,您可以在Javascript中使用onunload
处理程序,以便在用户导航时通知服务器。需要注意的一点是,此消息可能会丢失或无法发送(即JS关闭,浏览器崩溃等),并且您的计数可能会变得非常不准确。
或者,客户端可以每隔[predefined interval]
使用心跳对服务器执行ping操作,并且服务器会知道它们在线(当用户停止发送心跳时递减计数器,假设它们已经导航)
基于这些高级解决方案,它们还可以组合形成混合解决方案,使用心跳来检测用户是否仍在线,并使用onunload
处理程序在关闭/导航时立即通知服务器。 / p>
最后,就像关于cron作业的说明一样,Windows本身没有cron
,但可以使用计划任务完成类似的目标。
答案 2 :(得分:0)
有各种选择。这是我喜欢的,但你的里程可能会有所不同。
使用JavaScript要求您的用户偶尔轮询/突破您的服务器,并使用此请求来存储哪些用户在线。使用jQuery的JavaScript部分示例:
var ajaxCall;
var livedataTimer;
function poll(timeout){
livedataTimer = setTimeout(function(){
if (ajaxCall != null){
ajaxCall.abort();
}
if (timeout == 5){
timeout = 10000;
}
ajaxCall = $.ajax({ url: '/ajax/bump.php', type: 'POST', success: function(data){
poll(timeout);
}, dataType: "json"});
}, timeout);
return livedataTimer;
}
/ajax/bump.php
文件的示例:
<?php
session_start(); ## to know which user is online
## connect to your DB somewhere
mysqli_query($connection,"
INSERT INTO `online-status`
(`user`, `time`)
VALUES
(".(int)$_SESSION['user']['id'].", UNIX_TIMESTAMP())
");
return TRUE; ## return TRUE so that ajax knows the file has completed
?>
现在要获取在线用户列表,您可以使用条件查找online-status
表,例如“时间不超过20秒。”
将INSERT
数据放入单独的数据库,而不是UPDATE
userlist
数据库中的时间戳,这是一种很好的做法。这些往往很慢。
答案 3 :(得分:0)
每次用户访问某个页面时,我都使用time();
函数将值插入到users表中,并将其拉出并使用此函数,
echo '<h3>Online Users</h3>';
$query = "SELECT * FROM users";
$data = mysqli_query($dbc, $query);
while ($row = mysqli_fetch_array($data)){
if(time() - 10 < $row['active']){
echo '<a href="index.php?action=ucp&uid='.$row['uid'].'">'.$row['username'].'</a>';
}
}