原谅缺乏一个问题。 我试图建立一个与聊天室功能相同的网站。每个房间(有数千个房间)5-50个观众的想法是非常真实的,只有约1%的房间会聊天。
我有一些想法,但我提出的所有内容似乎都需要大量的处理能力......这样做的有效方法是什么?
答案 0 :(得分:2)
为此目的设计了特定的程序( 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量和对话长度。
答案 1 :(得分:1)
你问了一个非常广泛的问题,但是:
将每条消息作为一行存储在数据库中,使用AJAX重新加载聊天窗口内容和最后几条消息,例如。
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100
将为聊天室选择100条最新消息。循环结果并根据需要显示所有消息。
如果您的数据库用户具有创建表的权限,您还可以为每个聊天室动态创建一个表(这将更快地提高性能)
然后,您只需在表单中添加input
或textarea
,在提交时,会向数据库中插入一个新行(下次重新加载聊天窗口时,该行将显示给所有人)。
另一种更优化的方法是,通过在数据库中存储每条消息的时间戳,并在JavaScript中本地存储最后一个请求的时间戳,然后使用查询,仅向用户返回每条查询的新消息像:
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100
然后将结果附加到聊天窗口,而不是替换它。