【问题标题】:Long Polling causing server problems?长轮询导致服务器问题?
【发布时间】:2011-09-25 06:55:05
【问题描述】:

我终于制作了一个我想制作一段时间的简单聊天页面,但我的服务器遇到了问题。

我不确定长轮询是否是正确的术语,但据我了解,我认为是。我有一个对 php 页面的 ajax 调用,该页面检查 mysql 数据库中是否有比 ajax 请求中发送的时间更新的消息。如果没有更新的消息,它会一直循环并检查直到有。否则,它只返回新消息,客户端脚本在收到消息后立即发送另一个 ajax 请求。

一切正常,除了 000webhost 上的服务器在几条聊天消息后停止响应,x10 主机上的服务器给我一条关于达到资源限制的消息。

也许这是构建聊天系统的愚蠢方式,但我只知道该怎么做。如果有更好的方法请告诉我。

edit: 天哪,我突然想到我没有在服务器的 while 循环中放置任何睡眠时间。

【问题讨论】:

  • 看看cometd的实现:cometd.org
  • 链接根本没有帮助。我不知道 cometd 是什么,他们网站上的描述“可扩展的基于 HTTP 的事件路由总线”根本没有帮助。我讨厌尝试使用我一无所知的东西,我宁愿在我这样做之前努力理解它们。我从哪里开始?

标签: php javascript ajax long-polling


【解决方案1】:

您可以找到很多关于此的阅读材料,但我不相信免费的网络托管会允许您做您想做的事情。 PHP 也不是真正为创建聊天系统而设计的。

我建议使用WebSockets,例如,Node.JSSocket.IO,或 Tornado 和 Python;有很多解决方案,但其中大多数都需要您运行自己的服务器,因为它需要运行一个同时与多个连接交互的整个程序,而不是仅以单个连接开始和结束的简单脚本。

【讨论】:

  • 什么是 websocket?对不起,我是个菜鸟,但我绝对愿意学习。
  • 我完全同意使用 node.js 来做这类事情;它旨在以更传统的 Web 服务器无法很好地处理的方式很好地扩展到大量并发连接。不过,我不太确定 websockets;我更喜欢长轮询的额外 HTTP 开销,而不是依赖 websocket 强制执行的 browser support limitations
  • 我不知道 nodejs 是什么。我不知道它是如何工作的或如何使用它。
【解决方案2】:

无论服务器上是否有更新的消息,都使用相同的策略怎么样。服务器将始终返回一个较新消息的列表 - 当没有较新消息时,此列表可能为空。空列表也可以编码为特殊的数据令牌。 然后客户端以相同的方式处理这两种情况:它处理接收到的数据并在一段时间后请求新消息。

【讨论】:

  • 如果我使用超时来检查服务器,那么它就不再是即时的了。如果我在没有新消息的情况下返回,那么它将继续尽可能快地发送和接收请求,这会使浏览器陷入困境。
【解决方案3】:

确保你在每个循环中休眠(1)你的代码,代码每秒会进入循环多次,给你的数据库/服务器带来压力。

不过,nodejs 或 websockets 仍然是处理实时聊天的更好技术。

【讨论】:

  • 这是一个 5 年前的问题。用户在 2011 年已经说过“我突然想到我没有在服务器的 while 循环中放置任何睡眠时间。”并且接受的答案已经推荐了 Node.JS 和 websockets。
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多