我有一个注销功能,可以在我的数据库(mysql)中将用户设置为离线,但如果它只是关闭浏览器,那么在我的数据库中用户仍在线,尽管不是,我该如何管理?如何在不按下注销按钮的情况下将用户设置为脱机?提前干杯!
Ps:是的,我正在使用SESSION
答案 0 :(得分:0)
你可以通过多种方式实现这一目标:
onbeforeunload
javascript event。提示确认" Windows正在关闭,你确定吗? YES / NO"应该给你足够的时间在数据库中设置标志,只要确保用户点击"否"你应该取消你的旗帜PHP_SESSION
中添加一个var。如果它超过预设阈值(即5分钟),您可以安全地假设用户已经离开 onbeforeunload
function myConfirmation() {
return 'Are you sure you want to quit?';
}
window.onbeforeunload = myConfirmation;
答案 1 :(得分:0)
您可以尝试javascript beforeunload
事件:
window.onbeforeunload = function() {
// Some AJAX request to logout.php or whatever script handles the logout
}
当用户尝试关闭当前窗口时会触发。
但请注意,即使用户关闭了一个标签页(您的页面),也会触发该事件,因此如果打开了其他标签页,那么浏览器就会出现,并且您仍会获得用户退出。
此外,如果您的网站的多个标签页已打开,并且您关闭了其中一个标签页,那么您的用户就会退出,这可能不是您想要的,因此您可能需要查找解决问题的方法。
答案 2 :(得分:0)
HI唯一可靠的方法是设置一个调用服务器并将其记录在数据库中的间隔
var timeout = 15000; //milliseconds
setInterval( function(){
$.post('yoursite/keepalive' );
}, timeout );
然后你检查服务器端的会话你需要一个简单的数据库表,其中包含用户id和最后一次调用keepalive的时间戳,然后你只需获取当前时间的id(来自会话)并保存那。然后你可以检查它是否更像是20
秒,你知道它们已经消失了(应该每15秒更新一次)。显然,您需要在网站的每个页面上都有这个间隔才能准确跟踪用户。
检查会话时间和卸载等事情都不够准确,
关闭任何页面时会触发卸载,例如, 我们有一个打开2页的用户,他们关闭其中一个。另一个页面已经加载,因此客户端和服务器之间没有流量,也无法知道该页面是否仍处于打开状态
对于会话时间我们有类似的问题,比如有人在你的页面上阅读一篇长篇文章,他们需要使用这些设施并让页面保持打开状态。 30分钟后回来再继续阅读该帖子10分钟。现在也许会议已经过期,也许它还没有他们仍然在看你的网站,你无法知道它。
只要页面打开且没有javascript问题,间隔就会继续。这样做的一个缺点是它还会保持会话更新(您可以通过发送用户ID和ajax而不使用会话来解决这个问题,但这有其他复杂因素),因为您有15秒的更新,您可以随时查看如果超过15秒。假设您要向其他论坛用户显示在线用户列表,您只需查询该表中当前时间戳的所有人,这很容易让人感到尴尬。
至于间隔的时间量,您必须在性能(网络流量)和您需要知道信息的粒度之间取得平衡,如果只知道他们是否在最后一分钟然后使用它,如果你可以等5分钟知道等......
问题的关键在于服务器和客户端如何通信。没有双向沟通,就像你在电话上一样。它更像是一个walkies talky,你必须说10-4然后放开按钮让另一个人说话。本质上,客户端将发出请求,该请求由服务器完成。这是沟通和国家的结束。通过使用会话来维护后续请求状态,以便下一个请求使用该会话来记住'客户端。除此之外,客户端和服务器之间没有通信。例如,没有办法知道他们挂了电话,但问他们是否还在那里。 (这是一个过于简单化的原因,因为你无法从服务器发送请求,更像他们必须告诉你他们不在那里,除非你使用node.js或类似的东西)。
正如@David所提到的,您可以根据上次活动来跟踪这一情况,因为您只需要知道会话最后一次更新的时间。最简单的方法之一是通过http://php.net/manual/en/function.session-set-save-handler.php将会话移动到数据库处理程序中,这样就可以在上次活动时访问它。
使用此vs ajax实际上取决于您需要了解的内容以及准确程度。您的页面内容也需要权衡。如果您的网站经常发出请求,那么这将是一种更好的方法,因为您可以节省网络流量。但是,如果你有很长的帖子,有人可能会阅读20-30分钟,但想知道更频繁,然后使用ajax。
答案 3 :(得分:0)
您可以通过以下方式完成此操作。 1)每5秒向服务器发送一次Ajax请求以更新当前时间。 2)并且您想要离线显示的地方只需获取当前时间超过5秒的记录。