检查用户是否在页面上

时间:2012-02-09 09:30:32

标签: php mysql codeigniter

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

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

  2. 其他用户注册

  3. 用户根据他们注册的订单与主持人聊天

  4. 我想表明主持人是否在线。或者更进一步,显示主持人是否在房间里。

    我不知道该怎么做。

2 个答案:

答案 0 :(得分:5)

基本上,这件事情如下。

每当用户执行操作(聊天刷新,发送消息,访问页面等)时,与用户关联的令牌(保存在服务器中的令牌,例如DB)将按当前时间更新。

| 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分钟后,用户被宣布为离线

祝你好运!

答案 1 :(得分:1)

假设你在房间里有5个人(并且一个或多个人必须活跃),请执行以下操作:

  • 对于用户执行的每个操作(无论是击键还是实际的消息发送),“ping”服务器(向其发送您存在的消息)并将其记录(可能在您的数据库中)时间那件事发生了。 (请注意facebook如何“用户正在输入...” - 就是这样。

  • 反过来发送该动作(通过我认为的ajax),服务器的回复是该房间中在线但不在线的用户列表。通过比较当前时间与每个用户的上次活动时间(当前时间 - 上次活动时间=离开时间)来做到这一点

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

你可以做很多种可能性。比如说允许5分钟,否则,该用户是空闲的。如果时间差15分钟或更长时间,请考虑该人员。

您还可以更进一步,通过ping服务器以获取有关谁定期在线的更新,否则称为“心跳”,而不是通过按键或每次发送消息来执行此操作。程序是一样的:告诉服务器你在线,记录你的存在,并让它返回一个聊天伙伴列表。

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

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