如何在浏览器,meetup.com主页之类的浏览器中显示连续的实时更新?在python,PHP,node.js中,对服务器端的性能有何影响?如果页面被像akamai这样的CDN缓存,我们又如何实现相同的更新呢?
您有两个选择(其他选择已在上面详述)。如果您不熟悉每个选项背后的一些概念性想法,我想我会就它们给出一两行。请注意,我是在非常非常高的层次上介绍这些概念。
您的三个选择是:
短轮询 通过强制客户端向表单服务器连续发送请求,从而克服了客户端与服务器之间的单向通信:
Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: Yes. Here it is! Client: Yay! Client: (update message)
代表客户的持续na叫 轮询 。为了实现此结构,您需要将服务器设置为“侦听”来自客户端的这些轮询请求。服务器还必须将这些消息存储在某个地方,以便在消息准备就绪时,服务器可以传递它们。在非常简单的级别上,您的服务器需要:
您还需要将这些轮询请求与用户的某种会话ID绑定在一起,以便正确的消息到达正确的人。总体而言,该范式很复杂,我认为效率很低。
Web套接字是HTML5的新功能。它们背后的基本思想是,客户端可以保持与服务器的直接连接,并且它们可以相互来回 推送 信息。因此,与通常的情况不同:客户端发送GET请求>>服务器以内容进行响应,Web套接字使您可以保持连续的对话。
为了进行此设置,您需要:
设置有些复杂,尽管比长轮询更简单:
您将看到称为“ 推送通知”的 这种模式(当然,如果您拥有iPhone,您会遇到这种情况),因为服务器已被授权 将 “内容” 推 送到客户端(多么不礼貌!)。由于客户端和服务器之间存在许多细微差别,因此我建议您测试一下Pusher之类的东西,它基本上是一种Web服务,用于处理Web套接字的所有困难部分。在您自己进行设置之前,这将是您测试并使用模式的一种简便方法。它同时具有客户端和服务器端库。
希望这些信息能为您解决问题提供基线。其他答案对如何解决每种情况有更直接的信息。
Web套接字的另一种看似跨浏览器的方法是长轮询(请参阅Comet)。在这种情况下,您的客户端将建立与服务器的连接,并使其保持挂起状态,等待数据被推送回去。这样做的设置有些复杂,但确实代表了 Short Polling 和 Web Sockets 之间的中间立场。