原谅没有问题。我正在尝试建立一个与聊天室功能相同的网站。每个房间(有数千个房间)有 5-50 个观众的想法是非常真实的,只有大约 1% 的房间会聊天。
我有一些想法,但我想出的一切似乎都需要大量的处理能力......什么是有效的方法?
有为此目的而设计的特定程序(ircd,请参阅http://www.atheme.org/project/charybdis和类似的。)但是,如果您真的想重新发明轮子,您可能需要一个具有相当数量的物理 RAM 和共享内存扩展(例如:APC。)
共享内存功能(在这种情况下为 APC)将是让每个人的对话保持同步的最快方式,而硬盘驱动器不会过度旋转或 MySQL 会失控。您应该能够以这种方式容纳数百个并发请求,而服务器不会出汗,因为它不会对 MySQL 造成负担。它几乎直接从 RAM 芯片中读取。
您可以为对话存储单独的频道(例如:“channel-#welcome”)并直接通过 AJAX 轮询它们。请参阅apc_store
和apc_add
了解apc_fetch
更多信息。
即使您最终出于某种原因将对话存储在 MySQL 中,仍然最好使用某种内存缓存进行读取,因为这会减轻数据库服务器的巨大负载。
如果你这样做,最好让你的数据库innodb,因为它们在写入期间不会锁定。使用 APC,您的限制因素将是您打算保留在共享缓冲区中的 RAM 量和会话长度。
你问了一个非常广泛的问题,但是:
将每条消息作为一行存储在数据库中,使用 AJAX 重新加载包含最后几条消息的聊天窗口内容,例如
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100
将为聊天室选择 100 条最新消息。循环遍历结果并根据需要显示所有消息。
如果您的数据库用户有权创建表,您还可以为每个聊天室动态创建一个表(这会提高性能)
然后,您只需在表单中添加一个input
or textarea
,当提交时,它会在数据库中插入一个新行(下次重新加载聊天窗口时将显示给每个人)。
另一种更优化的方法是每次查询只向用户返回新消息,方法是将每条消息的时间戳存储在数据库中,并将最后一个请求的时间戳本地存储在 JavaScript 中,然后使用如下查询:
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100
然后将结果附加到聊天窗口,而不是替换它。