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

我尝试过阅读一些文章,但我还没有很清楚这些概念。

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

  1. 长轮询
  2. 服务器发送的事件
  3. 网络袜子
  4. 彗星

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

现在,我应该将哪一个用于实时应用程序。我一直在听说很多关于websockets(带有 socket.io[节点.js库]),但为什么不是PHP呢?


答案 1

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

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

常规 HTTP:

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

HTTP

Ajax Polling:

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

Ajax Polling

Ajax Long-Polling:

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

Ajax Long-Polling

HTML5 Server Sent Events (SSE) / EventSource:

  1. 客户端使用常规 HTTP 从服务器请求网页(请参阅上面的 HTTP)。
  2. 客户端接收请求的网页,并在打开与服务器的连接的页面上执行 JavaScript。
  3. 当有新信息可用时,服务器会向客户端发送事件。

HTML5 SSE

HTML5 Websockets:

  1. 客户端使用常规 http 从服务器请求网页(请参阅上面的 HTTP)。
  2. 客户端接收请求的网页,并在打开与服务器连接的页面上执行 JavaScript。
  3. 服务器和客户端现在可以在新数据(在两端)可用时相互发送消息。

    • 从服务器到客户端以及从客户端到服务器的实时流量
    • 您将需要使用具有事件循环的服务器
    • 使用WebSockets,可以从另一个域连接到服务器。
    • 也可以使用第三方托管的websocket服务器,例如Pusher或其他服务器。这样,您只需要实现客户端,这非常简单!
    • 如果你想阅读更多,我发现这些非常有用:(文章),(文章)教程)。

HTML5 WebSockets

彗星:

Comet是HTML5之前的一系列技术,它们使用流和长轮询来实现实时应用程序。在维基百科这篇文章上阅读更多内容。


现在,我应该将哪一个用于实时应用程序(我需要编码)。我一直在听很多关于websockets(socket.io[节点.js库]),但为什么不PHP呢?

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


答案 2

Tieme在他出色的答案上付出了很多努力,但我认为OP问题的核心是这些技术与PHP的关系,而不是每种技术的工作原理。

PHP是Web开发中最常用的语言,除了明显的客户端HTML,CSS和Javascript。然而,PHP在实时应用程序方面有2个主要问题:

  1. PHP最初是一个非常基本的CGI。PHP从早期阶段开始就已经取得了很大的进步,但它是以小步的方式发生的。PHP在成为今天可嵌入且灵活的C库时已经拥有数百万用户,其中大多数用户都依赖于其早期的执行模型,因此它还没有在内部尝试摆脱CGI模型。甚至命令行界面也会调用PHP库(在Linux上,在Windows上等),就好像它仍然是处理GET / POST请求的CGI一样。它仍然执行代码,就好像它只需要构建一个“页面”,然后结束它的生命周期。因此,它对多线程或事件驱动编程(在PHP用户空间内)的支持很少,这使得它目前对于实时,多用户应用程序是不切实际的。libphp5.sophp5ts.dll

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

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

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


推荐