【问题标题】:Web Chat in PHP + MySQL +JavaScriptPHP + MySQL + JavaScript 中的网络聊天
【发布时间】:2012-03-28 01:33:30
【问题描述】:

我希望使用 PHP、MySQL 和 JavaScript 创建一个网络聊天系统。

目前,我将消息存储在 MySQL 数据库中,其中包含增量 ID(是的,它已编入索引)、时间戳、发送者和消息本身。然后,我使用 AJAX 每 500 毫秒查询一次数据库,查看是否有比收到的最后一条消息更新的消息。然而,我有一种感觉,这可能是非常低效的,因为当多个用户在线时,它会导致 MySQL 服务器上的大量负载。在 Google 和这里​​浏览了一下,一切似乎都指向了这种做法。

我的问题:有没有更好的方法来做到这一点?也欢迎任何关于如何减少服务器负载的提示。

我在 Apache 网络服务器上使用 PHP 5.3,因此与这些兼容的库或插件会很好。

编辑: 忘了在原帖中提及,但我并不担心支持 IE 或其他过时的浏览器。

【问题讨论】:

标签: php javascript mysql ajax


【解决方案1】:

您应该研究 ajax 长轮询,简而言之,这是一个简单的 ajax 调用,但如果没有新数据,则不会从服务器返回结果。您只需在服务器端执行一个简单的循环,直到有新数据可用,然后返回它。当然,如果一段时间后(例如 1 分钟)没有结果发送给客户端,您最终必须停止此操作,然后重新启动呼叫。

【讨论】:

  • 您能提供一个这样的代码示例吗?看起来这可能是我想要的,但我现在还不确定如何去做。
【解决方案2】:

我想,对于存储引擎 MySQL 来说,聊天太密集了。也许,MEMORY 表类型会没问题,从没用过。我与几位开发人员交谈过,每个人都同意,聊天的最佳选择是Memcache,或者甚至编写您自己的自定义守护程序(仅使用内存存储)。

对于客户端部分,您可以阅读有关通过 flash/Java 对象的短轮询、长轮询和网络套接字/套接字的信息。

使用 AJAX 每 500 毫秒查询一次数据库

是短轮询。

【讨论】:

    【解决方案3】:

    可能可行的基本方法:

    • 在内存缓存中缓存 50 条最新消息。每当将新条目添加到数据库时,请重置此设置。当新用户连接时,向他们提供这 50 条消息以填充他们的聊天室。
    • 使用http://www.pubnub.com/ 等第三方服务向您的客户发送消息。每当有新消息发送到您的聊天室时,请在 pubnub 上发送。您的服务器代码将在成功写入数据库后执行此操作。

    注意:我不隶属于 pubnub。您也不需要使用上述 50 条消息。根据您的设置方式,您甚至不必在他们连接时给他们任何消息。关键是在这种情况下,您希望避免用户从您的数据库中读取数据 - 该模型不太可能针对此类应用程序进行扩展。

    理想情况下,事件环境将是此类应用的理想选择。 LAMP 堆栈不是特别适合。

    【讨论】:

      【解决方案4】:

      我会推荐使用这个库,Pubnub。 Pubnub 是一种通过 javascript 或任何 TCP 语言(例如 PHP)发送无线电信号的简单方法 - 并且 javascript 会立即接收发送的消息。

      在 PHP 中,您可以简单地将其保存到数据库中 - 然后使用 Pubnub 的 PHP API 将消息发送给页面上的其他所有人。

      如果您熟悉 Html、Javascript 和 PHP - 它可以相当容易学习。我会推荐它。

      【讨论】:

        【解决方案5】:

        您正在询问一个专门用 PHP、MySQL 和 HTML 和 JavaScript 构建的网络聊天系统。有很多选项,包括预建解决方案:http://www.cometchat.com/http://www.arrowchat.com/,它们都具有由 http://www.pubnub.com/ 等云产品提供支持的聊天彗星服务,并可以选择自己托管。查看更多关于 CometServices http://www.cometchat.com/cometservice/third-party-alternatives 的信息,您可以在其中比较服务提供商。还有更多选择,但我建议从那里开始。如果您需要更简单的东西,例如仅 HTML 和 JavaScript 的解决方案,您可以查看 http://www.pubnub.com/blog/build-real-time-web-apps-easy,这是一个关于使用 10 行 JavaScript 代码的示例聊天应用程序轻松构建实时 Web 应用程序的博客。该解决方案通过为所有浏览器和移动设备提供完整的跨平台来缩短开发时间。

        【讨论】:

          【解决方案6】:

          套接字是比 AJAX 轮询更好的解决方案,但是关于如何将基于套接字的聊天与 MySQL 集成的问题并不多。

          我已经做了一些测试,并有一个基本示例在这里工作:https://github.com/andrefigueira/PHP-MySQL-Sockets-Chat

          它使用 Ratchet (http://socketo.me/) 在 PHP 中创建聊天服务器。

          您可以通过向服务器发送 JSON 与谁在聊天的信息来将聊天消息发送到数据库,(如果您当然有用户会话)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-22
            • 1970-01-01
            • 2020-12-01
            • 2011-06-02
            • 2010-11-08
            • 2011-07-12
            相关资源
            最近更新 更多