PHP应用中的未读消息计数

时间:2011-05-02 10:52:10

标签: php javascript sql message

我目前正在开发一个简单的PHP应用程序,用户可以相互发送消息。消息存储在SQL数据库中。我想在每个页面的菜单中放置一些未读消息,以便用户可以快速查看是否有新消息而无需定期检查收件箱。

虽然这可能是一个容易解决的问题,但我不知道最佳方法是什么,性能方面:

  1. 在每个页面加载上显示未读消息的纯SQL COUNT()(立即通知更改,但可能会严重影响性能?)
  2. 做同样的事情,但是将结果缓存X分钟(我们制造了令人讨厌的延迟)
  3. 与2.相同,但仅在我们阅读邮件或向我们发送邮件时更新(可能会占用大量RAM /压力磁盘,因为我们创建了一个持久性条目/ file per user:我们无法将其存储在$ _SESSION中,因为当另一个用户向我们发送消息时我们需要更新它)
  4. 我的所有解决方案都基于服务器,因为我对JS不是很熟悉。但如果使用JavaScript存在更好的解决方案,那没关系。

    感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

我建议4日:

向用户发送新邮件后,您需要更新memcache中的计数器。您可以在客户端创建简单的ajax应用程序,每隔X秒发送一次请求。在服务器端,您只需检查是否有未读消息。在页面刷新时,您不需要查询数据库,因为您可以非常快地从memcache计算。

如果我在DB中遇到瓶颈,那就是我所做的(在90%的情况下,DB是任何数据库驱动的应用程序的周末部分)。

这就是我们通常在高负载网站上所做的事情:我们试图避免任何COUNTER查询。如果没有,我们将数据库非规范化以将计数器存储在适当的表中,作为另一列,例如如果您无法使用memcache,则会将未读消息计数器存储为Users表的列。

答案 1 :(得分:1)

除了我将memcached添加为解决方案4之外,我会选择第三选项。

答案 2 :(得分:1)

  

执行未读的纯SQL COUNT()   每页加载的消息(即时   已通知变更,但可能会产生影响   表现很糟糕?)

只要你有一个像样的表结构,COUNT()是一个非常快的命令。我不会缓存这个特定的命令。我会改编其他查询,以确保在向他们展示商家信息时只返回所需的数据。例如,如果你需要的只是摘录,我肯定会做这样的事情:

SELECT id, author, msgdate, substring(body, 0, 50) from table where recipient = ?

而不是

SELECT * from table where recipient = ?;

答案 3 :(得分:0)

IMHO。最好让客户端ping服务器并发送一个带有未读消息量的json。在mysql中计数应该很快,所以我认为没有理由不使用它。只需在聊天会话中过滤结果即可。

对于数据库部分。最好的方法是存储填充在db表中的new_message并将其默认为1,并在加载消息时将其设置为0。