【问题标题】:Scale-able chat-room using PHP/MySQL?使用 PHP/MySQL 的可扩展聊天室?
【发布时间】:2012-07-11 04:34:35
【问题描述】:

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

我有一些想法,但我想出的所有想法似乎都需要大量的处理能力......什么是有效的方法?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    有专门为此目的而设计的程序(ircd,请参阅http://www.atheme.org/project/charybdis 和类似的程序。)但是,如果您真的想重新发明轮子,您可能需要一个具有相当数量的物理内存和共享内存扩展(例如:APC。)

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

    您可以密钥存储用于对话的各个频道(例如:“channel-#welcome”)并通过 AJAX 直接轮询它们。请参阅apc_storeapc_addapc_fetch 了解更多信息。

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

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

    【讨论】:

    • 欣赏长答案,非常有趣。你会推荐 APC 方法而不是 Comet 吗? (stackoverflow.com/questions/4174521/…)
    • 请不要重新发明这个轮子。接受他的建议的第一部分,并使用已经设计用于处理聊天的程序。用 PHP 和 MySQL 构建聊天服务器是个糟糕的主意。
    • @GavinTowey 感谢您的建议,但理解/实施 ircd/charybdis 似乎超出了我的技能水平。我很高兴不使用 MySQL,只要我对代码的工作原理有很好的理解,所以如果以后出现问题,我可以很容易地看到哪里出了问题。
    • 在这种情况下,APC 和 Comet 将互为补充。你可以同时使用。
    【解决方案2】:

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

    将每条消息作为一行存储在数据库中,使用 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
    

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

    【讨论】:

    • 但是这不会像疯了一样打击我的服务器吗? 1000 个用户每秒执行 100 次选择?
    • 假设你每秒刷新一次,那不就是 1000 个用户每秒做 1 次选择吗?
    • 抱歉打错了,但是我计划维护的用户数量仍然是我不认为我的服务器可以处理它。
    • 您也可以让 PHP 每秒写入一个文件,然后 AJAX 每秒加载该文件。这样,每个聊天室的查询每秒只运行一次,并且所有 AJAX 请求都发送到 PHP 生成的静态文件。
    • 我有这个想法,但是好像有点麻烦?在研究@pp 分享的想法时,我发现了更多关于这个主题的想法。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2011-11-04
    • 2012-07-31
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多