【问题标题】:How to determine when a user has officially left or entered a page如何确定用户何时正式离开或进入页面
【发布时间】:2016-07-26 01:04:57
【问题描述】:

我目前正在开发一个聊天系统,只是为了提高自己作为一名程序员的能力,因为我还很年轻 (17)。当用户登录时,消息“{user} 已进入聊天。”在聊天中显示。同样,当用户注销时,“{user} 已离开聊天”消息。显示出来。

这两个功能都可以正常工作。但是,我还想确定用户何时关闭页面(留言)以及何时回来(输入留言)。

为了在一定程度上做到这一点,我做了以下事情:

1、在主聊天页面(chat.php)上,我设置了一个名为onpage的会话

2、当用户离开页面时,以下脚本将通过AJAX(jQuery)在onbeforeunload事件中运行:

    //setoffline.php

    unset($_SESSION["onpage"]); // unset the session
    if ($_POST['logout'] == "false") { // in our case, this will evaluate true
        sleep(3); // halt the script for 3 seconds
        if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) 
            die();
        }
    }
    // if continued, send the offline message
    ...
    $_SESSION["left"] = "true";

3,脚本运行,然后休眠三秒钟,然后检查会话是否仍然存在(如果用户在三秒钟内返回,会话将被重置)。如果没有则:脚本将完成,将发送留言,并设置会话left

4,当用户返回时,会触发一个 onload 函数来检查会话left。如果设置了,则发送回车消息,会话left 将被取消设置。

问题:

到目前为止,我确信您已经发现我的算法存在问题。我自己也看到了很多问题。一方面,使用sleep 函数似乎不正确,也不能正常工作。关闭页面时它可以正常工作(因为没有人在 3 秒内返回),但是当您刷新时,它会导致页面停止三秒钟,这是我不想要的。我只是想要一种方法来识别用户何时正式离开并共轭返回页面。

【问题讨论】:

  • 您知道每个用户都有自己的会话吗?
  • 这不是问题。如果用户关闭页面,每个用户都有自己的会话这一事实如何帮助通知我用户已离开聊天? @delueg
  • 当有新的聊天消息进来时如何更新浏览器?某种投票?也许轮询数据还可以返回登录聊天的用户列表。然后你可以查看哪些人离开了聊天。 (使用 onbeforeunload 发送命令将用户注销或将其标记为已离开聊天)。
  • 我使用服务器发送的事件来不断地从服务器接收我的数据。如果刷新时不触发 onbeforeunload,这个想法会很好。这是因为如果用户刷新,它会创建一个leavingmessage 和entering 消息以立即返回聊天,使聊天非常难看。这就是为什么我考虑使用 sleep 函数来等待用户返回的原因,但这不起作用。 @KyleRidolfo
  • 一般来说我的脚本是有效的。唯一的问题是刷新按钮也会触发onb​​eforeunload

标签: javascript php jquery ajax session


【解决方案1】:

最好的解决方案是每 5 或 10 秒后对服务器进行一次AJAX 调用。此 AJAX 请求将更改服务器 DB 上关于在其浏览器中打开页面的每个用户的最后在线状态(日期时间)。

如果他离开页面,什么也不做。在这种情况下,AJAX 请求将不会调用,并且上次在线时间不会更新。

现在您显示用户在线和离线的另一端。这是另一个 Ajax 请求(每 5 或 10 秒)从服务器拉取数据,它确定谁在 5 或 10 秒前在线。根据用户过去的状态和现在的状态,可以判断每个用户的在线/离线状态。

希望你能理解。

【讨论】:

    【解决方案2】:

    正如另一个答案中提到的,一个选项是让每个客户端以某个设定的时间间隔轮询服务器。然后,服务器会假设最近没有轮询的任何客户端都“离开”了。这种方法的一个巨大缺点是它使用大量带宽。

    另一种方法是将确定何时显示消息的逻辑移至每个客户端。当用户离开房间时,服务器会以某种方式通知房间中的其他人该人已经离开。而不是客户端立即显示该消息,它可以使用setTimeout,然后检查服务器是否发送了另一条消息,说明同一用户回到了房间。您可以在与用户关联的某个 HTML 块上使用 data 属性来记录它可能已经离开和返回。


    至于如何保持各种客户端和服务器之间的连接,我建议研究一种称为 BOSH 的技术。

    wikipedia page 很好地介绍了 BOSH 是什么以及为什么它比其他替代方案更好,例如不断“轮询”服务器。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多