繁体   English   中英

关闭数据库时,如何使用户在数据库中脱机?

[英]How to set offline a User in the DB when it closes the browser?

我有一个注销功能,可将用户设置为在我的数据库(mysql)中脱机,但是如果它只是关闭浏览器,则在我的数据库中,该用户仍然处于联机状态,尽管不是,我该如何管理? 如何在不按注销按钮的情况下将用户设置为脱机? 提前加油!

附言:是的,我正在使用SESSION

您可以通过多种方式进行操作:

  • onbeforeunload javascript事件上启动AJAX调用 提示您确认“ Windows正在关闭,您确定吗?是/否”应该给您足够的时间来设置数据库中的标志,只需确保如果用户单击“否”,则应该取消设置标志
  • 检查会话时间...在您的PHP_SESSION中添加一个PHP_SESSION ,该PHP_SESSION在每次用户事件时都会更新。 如果它超过预设的阈值(即5分钟),则可以安全地假设用户已离开

onbeforeunload示例

function myConfirmation() {
    return 'Are you sure you want to quit?';
}

window.onbeforeunload = myConfirmation;

您可以尝试javascript beforeunload事件:

window.onbeforeunload = function() {
    // Some AJAX request to logout.php or whatever script handles the logout
}

当用户尝试关闭当前窗口时,它将触发。

但是请注意,即使用户关闭单个选项卡(您的页面),也会触发该事件,因此,如果打开了其他选项卡,浏览器也会打开,并且您仍将注销用户。

另外,如果您打开了网站的几个标签,然后关闭了其中的一个标签,您将注销用户,这可能不是您想要的,因此,您可能必须找到一种解决方法。

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分钟才能知道等等...

真正问题的症结在于服务器与客户端之间的通信方式。 正确,没有像电话一样的双向通讯。 这更像是对讲机,在通话中您必须说10-4,然后放开按钮让另一个人讲话。 本质上,客户端将发出请求,该请求由服务器完成。 那就是沟通和状态的终结。 通过使用会话来维护后续请求状态,因此下一个请求使用该会话来“记住”客户端。 否则客户端和服务器之间就没有通信。 例如,没有办法知道他们挂了电话,而是问他们是否还在。 (这是一个过分的简化,因为您不能从服务器发送请求以进行询问,更像是它们必须告诉您它们不在那里,除非您使用node.js或类似的东西。)

正如@David提到的,您可以根据上一次活动进行跟踪,因为您只需要知道会话的最新更新时间即可。 最简单的方法之一是通过http://php.net/manual/en/function.session-set-save-handler.php将会话移到数据库处理程序中,这样您就可以在上次激活它们时访问它们。

使用this vs ajax确实取决于您需要了解的内容以及准确性。 页面的内容也很重要。如果您有一个经常发出请求的网站,那将是一个更好的方法,因为例如可以节省网络流量。 但是,如果您发表的文章很长,则有人可能会阅读20至30分钟,但想更频繁地阅读,那么请使用ajax。

您可以按照以下方式进行操作。 1)每5秒钟将Ajax请求发送到服务器以更新当前时间。 2)并且您要脱机显示的位置仅获取当前时间超过5秒前的记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM