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

我试着读了一些文章,但我对概念还不太清楚。

有人愿意向我解释一下这些技术是什么吗:

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

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

现在,我应该将其中的哪一个用于实时应用程序。我已经听到了很多关于webSocket(socket.io[node.js库])的消息,但为什么不使用PHP呢?

205424 次浏览

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

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

常规HTTP:

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

HTTP

Ajax轮询:

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

Ajax轮询

Ajax长轮询:

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

Ajax长轮询

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

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

HTML5 SSE

HTML5 WebSocket:

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

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

HTML5 WebSocket

彗星:

Comet是HTML5之前的技术集合,它使用流和长轮询来实现实时应用程序。阅读wikipedia这个文章的更多信息。


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

您可以将PHP与WebSocket一起使用,请查看棘轮

Tieme为他出色的回答付出了很多努力,但我认为OP问题的核心是这些技术如何与PHP相关,而不是每种技术如何工作。

除了明显的客户端超文本标记语言、CSS和Javascript之外,PHP是Web开发中最常用的语言。然而,PHP在实时应用程序方面有两个主要问题:

  1. PHP从一个非常基本的CGI开始。从早期开始,PHP已经取得了长足的进步,但这是一个小步骤。当它成为今天的可嵌入和灵活的C库时,PHP已经拥有数百万用户,其中大多数人依赖于其早期的执行模型,因此它还没有在内部进行可靠的尝试来逃避CGI模型。即使是命令行界面调用PHP库(Linux上的libphp5.so,Windows上的php5ts.dll等),就好像它仍然是处理GET/POST请求的CGI一样。它仍然执行代码,就好像它只需要构建一个“页面”然后结束其生命周期一样。因此,它对多线程或事件驱动编程(在PHP用户空间内)的支持非常少,这使得它目前不适用于实时、多用户应用程序。

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

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

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

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

看这个例子:使用PHP和Node.js创建实时聊天应用程序

投票

基本上,轮询是一种定期从服务器请求信息的技术。这种连接是通过遵循HTTP协议进行的。有两种类型的轮询:

  1. 短轮询
  2. 长轮询

短轮询

简而言之,轮询,客户端向服务器请求信息。服务器处理请求。如果数据可用于请求,服务器会使用所需信息响应请求。但是,如果服务器没有数据可用于客户端,服务器会返回空响应。在这两种情况下,返回响应后连接将关闭。即使在服务器发送空响应后,客户端也会不断发出新请求。这种机制增加了服务器的网络成本。

长轮询

在长轮询中,客户端可以向服务器请求信息,期望服务器可能不会立即响应。当服务器收到请求时,如果它没有客户端的新数据,而不是返回空响应,服务器会保持请求打开并等待数据到达。当服务器收到新数据时,它会立即将响应传递给客户端,完成打开的请求。然后,客户端可以在从服务器获得答案后再次发送新更新请求。长轮询通过减少空响应的数量来降低成本。

WebSocket

WebSocket是一种通过单个传输控制协议提供双向通信通道的协议。WebSocket促进了客户端和服务器之间的持久连接,允许双方随时开始传输数据。WebSocket握手是客户端创建WebSocket连接的过程。如果操作成功,服务器和客户端可以随时发送和接收数据。主要用于WhatsApp、Uber等实时Web应用程序。

服务器发送事件(SSE)

与WebSocket不同,我们不能使用SSE从客户端向服务器发出请求,因为它是单向连接。当我们需要从服务器到客户端的“近实时”传输时,或者如果服务器在循环中生成数据,SSE是理想的选择。

彗星

Comet是一种Web应用程序设计范式,它描述了服务器和Web浏览器之间使用本机HTTP方法进行的连续、双向交互。Comet是一个总称。Ajax Push、HTTP Streaming和HTTP Server Push是一些可用于提供这种事件驱动交互的HTTP机制。