什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?

问题描述 投票:953回答:4

我曾尝试阅读一些文章,但我对这些概念还不是很清楚。

有人愿意尝试向我解释这些技术是什么:

  1. 长轮询
  2. 服务器发送的事件
  3. 的WebSockets
  4. 彗星

我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端。如何保持连接打开,客户端如何获取推送数据? (客户端如何使用数据,也许某些代码可能会有帮助?)

现在,我应该将其中哪一个用于实时应用。我一直听说很多关于websockets(有socket.io [一个node.js库]),但为什么不用PHP?

php websocket comet long-polling server-sent-events
4个回答
1984
投票

在下面的示例中,客户端是浏览器,服务器是托管网站的Web服务器。

在了解这些技术之前,您必须首先了解经典的HTTP Web流量。

常规HTTP:

  1. 客户端从服务器请求网页。
  2. 服务器计算响应
  3. 服务器将响应发送给客户端。

Ajax轮询:

  1. 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP)。
  2. 客户端接收所请求的网页并在页面上执行JavaScript,该JavaScript以规则的间隔(例如0.5秒)从服务器请求文件。
  3. 服务器计算每个响应并将其发回,就像普通的HTTP流量一样。

Ajax Long-Polling:

  1. 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP)。
  2. 客户端接收请求的网页并在页面上执行JavaScript,该页面从服务器请求文件。
  3. 服务器不会立即响应所请求的信息,而是等待有新信息可用。
  4. 当有新信息可用时,服务器会使用新信息进行响应。
  5. 客户端接收新信息并立即向服务器发送另一个请求,重新启动该过程。

HTML5服务器发送事件(SSE)/ EventSource:

  1. 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP)。
  2. 客户端接收请求的网页并在页面上执行JavaScript,该页面打开与服务器的连接。
  3. 当有新信息可用时,服务器会向客户端发送事件。 从服务器到客户端的实时流量,大部分都是您需要的 您将需要使用具有事件循环的服务器 与其他域的服务器的连接只能是with correct CORS settings 如果你想阅读更多,我发现这些非常有用:(article)(article)(article)(tutorial)

HTML5 Websockets:

  1. 客户端使用常规http从服务器请求网页(请参阅上面的HTTP)。
  2. 客户端接收请求的网页并在页面上执行JavaScript以打开与服务器的连接。
  3. 现在,当新数据(在任一侧)可用时,服务器和客户端可以相互发送消息。 从服务器到客户端以及从客户端到服务器的实时流量 您将需要使用具有事件循环的服务器 使用WebSockets,可以从另一个域连接服务器。 也可以使用第三方托管的websocket服务器,例如Pusherothers。这样你只需要实现客户端,这很容易! 如果你想阅读更多,我发现这些非常有用:(article),(article)tutorial)。

彗星:

Comet是HTML5之前的一系列技术,它们使用流式传输和长轮询来实现实时应用。阅读更多关于wikipediathis的文章。


现在,我应该将它们中的哪一个用于实时应用程序(我需要编写代码)。我一直听说很多关于websockets(有socket.io [一个node.js库]),但为什么不用PHP?

您可以将PHP与WebSockets一起使用,请查看Ratchet


36
投票

Tieme在他的优秀答案中投入了大量精力,但我认为OP问题的核心是这些技术与PHP的关系,而不是每种技术的工作原理。

除了明显的客户端html,css和javascript之外,PHP是Web开发中使用最多的语言。然而,PHP在实时应用程序方面有两个主要问题:

1)PHP作为一个非常基本的CGI开始。自从早期阶段开始,PHP已经取得了很大进展,但它只是小步骤发生的。 PHP在成为今天的嵌入式和灵活的C库时已经拥有数百万用户,其中大多数用户依赖于它早期的执行模式,所以它还没有做出明确的尝试来逃避内部的cgi模型。甚至命令行界面也会调用PHP库(linux上的libphp5.so,windows上的php5ts.dll等),好像它仍然是一个处理GET / POST请求的cgi。它仍然执行代码,好像它只需要构建一个“页面”然后结束它的生命周期。因此,它几乎不支持多线程或事件驱动的编程(在PHP用户空间内),这使得它对于实时的多用户应用程序来说当前不实用。

请注意,PHP确实具有在PHP用户空间中提供事件循环(例如libevent)和线程(例如pthreads)的扩展,但非常非常少的应用程序使用这些。

2)PHP仍然存在垃圾收集的重大问题。虽然这些问题一直在不断改进(可能是结束生命周期的最大步骤,如上所述),但即使是创建长期运行的PHP应用程序的最佳尝试也需要定期重新启动。这也使得它对于实时应用程序来说不实用。

PHP 7将是解决这些问题的重要一步,并且作为实时应用程序的平台似乎非常有前途。


9
投票

我试图记下这些并从java的角度收集和编写示例。

HTTP for Java Developers

Reverse Ajax - Old style

Async Handling on server side

Reverse Ajax - New style

Server Sent Events

将它放在任何正在研究相同主题的java开发人员。


0
投票

您可以在Web应用程序中轻松使用Node.JS进行实时通信。当关于WebSockets时,Node.JS非常强大。因此,“通过Node.js的PHP通知”将是一个伟大的概念。

看到这个例子:Creating a Real-Time Chat App with PHP and Node.js

© www.soinside.com 2019 - 2024. All rights reserved.