存储聊天应用程序的“用户在线”列表(php / ajax)

时间:2010-11-29 19:06:27

标签: php javascript ajax chat

我有几个聊天室。目前,我将聊天用户列表存储在php变量中。如果用户进入或离开房间,则从该列表中添加/删除用户的姓名。 为了使这个存储持久化,我使用memcached。要更新聊天室的状态并将用户列表发送给聊天室中的所有用户,我会使用定期的ajax请求将用户列表提取到聊天中的用户的浏览器中。

没关系。但我怀疑,如果聊天中有几百人,那么每隔XX秒向所有人发送聊天用户的清单是个好主意。

聊天室通常如何处理这个问题?

6 个答案:

答案 0 :(得分:2)

不知道他们是怎么做的,但这里有一些方法可以。请记住在优化之前和之后进行测量。

  • 版本列表。如果您拥有最新版本,请不要获取完整列表。
  • 区分列表。仅发送自上次更新以来的更新。
  • 记录此列表。在新事件发生时缓存或推送更新。

答案 1 :(得分:1)

我运行聊天室的方式,我为所有新邮件和新签到并签名加盖时间戳。

当用户进入房间时,我会下载完整列表。 我会定期(通过带有JSON调用的AJAX)下载任何新事件(消息,登录和注销)。并相应地更新相关列表。

答案 2 :(得分:1)

可以将数据从服务器推送到客户端(http://stackoverflow.com/questions/19995/is-there-some-way-to-push-data-from-web-server-to-browser) 。但是,如果您仍想进行轮询,我会实现类似于HTTP 304响应的内容。

答案 3 :(得分:0)

老实说,你所做的一切听起来不错。继续做你想做的事。也许跟踪最后一个列表,如果它们在最后x时间内发生了变化,则只发送更新?如果你真的想节省几个字节。

答案 4 :(得分:0)

我会通过聊天消息所经过的同一频道推送列表更新。如果它是一个无限加载的页面,也许你可以在页面中注入这样的东西:

<script>updateUserlist({user:"alice", eventtype:"leave"});</script>

答案 5 :(得分:0)

感谢所有建议。另外,我将研究运行彗星服务器。 长轮询方法不能很好地扩展。