使用PHP/MMySQL扩展聊天室


Scale-able chat-room using PHP/MySQL?

请原谅没有问题。我正在尝试建立一个与聊天室功能相同的网站。每个房间(有数千个房间)有5-50名观众的想法是非常真实的,只有大约1%的房间会聊天。

我有一些想法,但我想到的一切似乎都需要疯狂的处理能力。。。做这件事的有效方法是什么?

有专门为此目的设计的程序(ircd,请参阅http://www.atheme.org/project/charybdis以及类似的。)然而,如果你真的想重新发明轮子,你可能会想要一个拥有大量物理RAM和共享内存扩展(例如:APC)的托管解决方案

共享内存功能(在这种情况下为APC)将是保持每个人对话同步的最快方法,而不会使硬盘驱动器旋转过多或MySQL失控。您应该能够以这种方式容纳数百个并发请求,而不会让服务器汗流浃背,因为它不会对MySQL征税。它几乎直接从RAM芯片上读取。

您可以键存储对话的各个频道(例如:"channel-#welcome"),并通过AJAX直接轮询它们。有关详细信息,请参见apc_storeapc_addapc_fetch

即使您最终出于任何原因将对话存储在MySQL中,还是最好使用某种内存缓存进行读取,因为这会减轻数据库服务器的巨大负载。

如果你这样做,最好让你的数据库innodb,因为它们不会在写入过程中锁定。使用APC,您的限制试剂将是RAM的数量和您打算保留在共享缓冲区中的会话长度。

您提出了一个非常宽泛的问题,但是:

将每条消息存储为数据库中的一行,使用AJAX重新加载带有最后几条消息的聊天窗口内容,例如

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100

将为聊天室选择100条最新消息。循环显示结果并根据需要显示所有消息。

如果你的数据库用户有权创建表,你也可以为每个聊天室动态创建一个表(这将在性能方面更快)

然后,您只需在表单中有一个inputtextarea,当提交时,它会向数据库中插入一个新行(下次重新加载聊天窗口时,它将显示给所有人)。

另一种更优化的方法是,每次查询只向用户返回新消息,方法是将每条消息的时间戳存储在数据库中,并将最后一个请求的时间戳本地存储在JavaScript中,然后使用以下查询:

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100

然后将结果附加到聊天窗口,而不是替换它。