【问题标题】:Check if user is on page检查用户是否在页面上
【发布时间】:2012-02-09 09:30:31
【问题描述】:

我正在构建一个允许用户托管房间的一对一聊天应用程序。只是为了提供更多反馈:

  1. 用户创建房间(房间是公开的,任何人都可以查看,但如果用户尚未注册,聊天将被禁用并提示用户注册聊天。)

  2. 其他用户注册房间

  3. 用户根据注册顺序与主机聊天

我想显示主机是否在线。或者更进一步,显示主持人是否在房间内。

我不知道该怎么做。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    基本上,这些工作如下。

    每次用户采取行动(聊天刷新、发送消息、访问的页面等)时,与用户关联的令牌(例如保存在您的服务器、数据库中的令牌)都会更新为当前时间。

    | User ID     | Last action         |
    -------------------------------------
    | 14 (mark)   | 2012-02-09-10:34:53 |
    | 56 (phil)   | 2012-02-09-09:12:34 |
    |  9 (john)   | 2012-02-09-10:33:11 |
    

    然后,如果用户的令牌不是太旧(5/10 分钟?),那么您决定用户 在线

    如果您使用 AJAX 每 1 分钟左右向服务器发送一个定期请求,您可以改进此方法。此 AJAX 请求更新令牌值。因此,通过这种方式,您可以告诉用户是否在线,如果他什么都不做,只是盯着页面。当他退出(关闭浏览器或选项卡)时,AJAX 定期调用停止工作,因此 5/10 分钟后用户被宣布离线

    祝你好运!

    【讨论】:

    • 所以我需要创建一个表并发送主机的操作,然后检查该用户的 id 在特定时间间隔内是否有任何活动。
    • 在 codeigniter 中,您可以在每个控制器操作之前使用 filter 来检查用户是否已登录并更新令牌。
    • @ciprian 没错。如果您已经有一个用户表(我认为您有!),您也可以在该表中添加一个新列。你的选择:)
    • 感谢您的所有帮助。我还将尝试 CI 中的过滤器。它们看起来很有趣。
    【解决方案2】:

    假设你有 5 个人在房间里(并且肯定有一个或更多人处于活动状态),请执行以下操作:

      1234563那件事发生了。 (请注意 facebook 如何显示 “用户正在输入...” - 就是这样。
    • 反过来发送那个动作(我想通过ajax),服务器的回复是那个房间里在线和不在线的用户列表。通过将当前时间与内部每个用户的上次活动时间进行比较(当前时间 - 上次活动时间 = 离开时间)

    • 知道谁在线,谁不在线,在浏览器中重建“聊天对象列表”

    您可以实现多种可能性。比如说允许 5 分钟,否则,该用户处于空闲状态。如果时间差 15 分钟或更多,则认为该人离开。

    您还可以更进一步,通过 ping 服务器以了解谁定期在线的更新,或者称为“心跳”,而不必通过击键或发送每条消息来完成。过程相同:告诉服务器你在线,记录你的存在,并让它返回一个聊天伙伴列表。

    请注意,在此应用程序(浏览器聊天)中,服务器无法知道您离线、关闭浏览器等。这就是您需要“心跳”以及定期记录您的操作的原因。

    至于主机......你应该用主机ID标记那个房间,心跳会告诉你他是否仍然在线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2012-06-01
      • 2020-05-28
      相关资源
      最近更新 更多