与PHP和jQuery实时聊天。 在哪里存储信息? Mysql还是文件?

有1对1在线聊天。 两种解决方案

1)我将每条消息存储到数据库中,并使用jQuery的帮助我每秒检查数据库中是否有新消息。 当然我也使用缓存。 如果有,我们会给出这个消息。

2)我将每条消息存储在一个html文件中,每秒通过jQuery存储该文件一遍又一遍地显示。

什么是更好的? 还是有第三种选择? 一般来说,这个项目有什么更好的,mysql或文件?

非常感谢你。

PS最重要的问题是:什么更有效,哪种方式会少吃资源!

编辑:现在,它是非常糟糕的许多聊天(让我们说2,500个聊天,这意味着5,000个用户)使用长轮询并检查文件每秒通过javascript编辑? 我使用非常类似的聊天方法: http : //css-tricks.com/jquery-php-chat/它会杀了我的主机吗?

每个人都提出了广泛的意见,但我认为没有人真正触及过头脑。

当涉及到存储数据时,数据量,访问速率以及其他几个因素都决定了什么是最好的存储平台。

有些人建议使用memcached。 现在虽然这是一个有效的答案(你可以使用它),但我认为这不是一个好主意,完全基于memcached将数据存储在服务器内存中的事实。

您的内存不是用于数据存储,而是用于实际应用程序,操作系统,共享库等。

在内存中存储数据可能会导致当前运行的其他应用程序出现很多问题。 如果在RAM中存储过多数据,则应用程序将无法完成分配给它们的操作。

虽然这比基于磁盘的存储平台(如MySQL)快,但它并不可靠。

我个人会将MySQL用作存储引擎服务器端。 这样可以减少您遇到的问题,并使数据更易于管理。

为了加快对客户端的响应,我将查看服务器上的运行节点 。

这是因为它是事件驱动和非阻塞的。

那是什么意思?

好吧,当客户端A请求存储在硬盘驱动器上的某些数据时,传统上PHP可能会对C ++说,请将这块存储在硬盘驱动器扇区上的数据取出来。 C ++会说’确定没问题’,虽然它可以获取PHP所依赖的信息并等待数据在继续运行之前被读取并返回,同时阻止所有其他客户端。

对于节点,它略有不同。 Node会向内核说“获取这些信息,当你完成后,给我打电话”,然后继续接收来自其他可能不需要磁盘访问的客户端的请求。

所以突然因为我们已经为内核分配了一个回调,我们不必等待:),快乐的日子。

看看这张图片: 节点事件循环

这可能是您寻找的答案,请参阅以下内容以获取有关节点如何成为您的正确选择的更具描述性和详细信息:

第四个选项,如果您已经拥有要使用的PHP代码,可能不是您想要的,但也许最有效的方法是使用基于Javascript的服务器而不是php。

Node.js很容易成为聊天服务器,可以将所有最近的消息存储为Javascript变量。

您可以使用长轮询或其他彗星技术,这样您就不必等待一秒钟来更新消息。

此外,Javascript服务器的基于事件的体系结构意味着在等待消息时没有闲置的开销。

它取决于同一时间的聊天次数。 如果它是支持,并且您希望一次平均负载为1到5个聊天会话,那么您不必过于担心。 只需确保在一段时间内没有活动时停止刷新并显示一条消息,供用户单击以恢复聊天会话。

如果访问者将相互聊天并且您期望大量会话 – 同时10-50,您仍然可以使用PHP +数据库。 只需确保不进行冗余查询,并正确缓存查询。 要减少负载,您还可以拒绝在Web服务器中登录聊天脚本:

SetEnvIf Request_URI "^/chat.php$" dontlog CustomLog /var/log/apache2/access.log combined env=!dontlog 

编辑:

你可以有延迟架构。 例如,如果您使用延迟1秒查询2次并且没有数据,则可以将延迟增加到2秒。 如果您达到10个没有响应的查询 – 将延迟增加到5秒。 10分钟后,您可以暂停对话,要求用户单击按钮以恢复聊天。 这将与上述建议相结合,保证足够低的负载,以便进行多次并发聊天

EDIT2:

我建议你找一些flash或java解决方案并购买它。 拥有5000-10000用户,你必须天才才能使它在VPS上运行,特别是如果RAM不多。 不是说它不可能,但你可以租用更便宜的VPS,剩余的钱购买一些java或flash的解决方案(不知道是否支持2路连接,我不是闪存专家)。

关于用户数量的注意事项:如果您有10 000个用户,我的猜测是您同时不会超过100个聊天。 去看看约会网站 – 他们在线用户不超过10%,也许他们中的大多数都在做其他事情,而不是聊天

第三种选择。 使用MEMCACHE 。 无限快速的读/写。 非常适合您的应用。

将聊天消息存储在数据库中,但使用Memcached作为数据库读取的缓存层。 因此,最流行的读取(例如聊天室中的最后20条消息)将始终直接从内存中提供。

这为您提供了最快速操作的速度和所有消息的持久存储的好处。

只是抛出另一种选择……平面文件可以提供更少资源的替代方案。

为每个聊天分配一个唯一的ID和为其存储的平面文件。 每次聊天都会在此文件中添加一行。 然后,每个客户端计算机使用jquery仅检查文件的修改日期,以查看聊天是否已更新。

虽然我通常不会在数据库上推荐平面文件,但我有一种偷偷摸摸的感觉,检查平面文件上的修改日期会比MySQL替代扩展得更好。

我很好奇,所以我做了一些测试,结果如下:

  1. 使用现有的数据库连接,可以在1秒内运行的“SELECT field FROM table LIMIT 0,1”的数量:~4,000

  2. 打开和关闭数据库连接,但运行相同的查询:~1,800

  3. 检查各种不同文件的修改日期: ~225,000

因此,要检查对话是否已更新,将对话存储在平面文件中并检查上次修改日期将比使用数据库执行任何操作更快。

通常,在将数据推送到客户端时,http连接不是很有用。 在每x秒进行民意调查往往是任何服务器上的资源浪费,因为您有大量流量。

您应该尝试将XMPP与BOSH结合使用。 幸运的是,大部分繁重的工作已经为你完成了。 您可以非常快速地实现纯jquery(或其他基于js框架)的解决方案。 阅读本教程,它将对您有所帮助 – 不仅可以解决您的具体问题,而且可以让您更全面地了解如何通过good ole’http实现推送技术。

除非,它是一个小型受众脚本 – 在数据库与文件系统之间,最好使用数据库(。)

PS: – Flash也是聊天服务器的绝佳平台,你可能也想看看它。

如果您将对话定义为仅两个人,那么每秒一个请求看起来就像每个用户每秒一个读取请求,每次有人写一些东西(比如说每10秒)就有一个写入请求。 因此,每次对话,每10秒钟您将获得大约2.2个请求。

对于50个对话,这是100个用户和每秒220个请求。 对于如此少量的对话,服务器上的负载很大。 将对话写入JSON或XML可能会提供更具伸缩性的解决方案。

本文讨论了Meebo的架构 – 长轮询,彗星。

作为事后的想法,您是否考虑过安装像Jabber这样的IM服务器而不是从头开始?

你总能得到适合这项工作的工具……符合XMPP标准的软件。 因为文档差, ejabber很好。 因为它遵循XMPP标准: http : //code.google.com/p/ijab/您可以使用任何XMPP客户端。 如果您愿意,可以将所有内容存储在RDBMS中,并提供gmail / google talk中提供的类似function。

$ 0.02

一个非常快的替代方案可能是像MongoDB这样的NoSQL数据库:

  1. MongoDB主页
  2. 一些基准
  3. MongoDB在php.net上的扩展主页

我不使用它,但你可以尝试Photon ,一个基于Mongrel的超高速框架。 在作者博客 (法语)中,您有一个示例,30行代码用于实时聊天服务器,带有video演示。

我认为将数据存储在数据库中会更好。 请参考以下链接脚本教程聊天