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

时间:2012-06-18 06:28:09

标签: php websocket comet long-polling server-sent-events

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

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

  1. 长轮询
  2. 服务器发送的事件
  3. 的WebSockets
  4. 彗星
  5. 我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端。如何保持连接打开,客户端如何获取推送数据? (客户端如何使用数据,也许某些代码可能有帮助?)

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

5 个答案:

答案 0 :(得分:1969)

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

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

常规HTTP:

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

    Ajax轮询:

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

      Ajax Long-Polling:

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

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

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

        4. HTML5 SSE

          HTML5 Websockets:

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

            • 从服务器到客户端从客户端到服务器的实时流量
            • 您将要使用具有事件循环的服务器
            • 使用WebSockets,可以与另一个域的服务器连接。
            • 也可以使用第三方托管的websocket服务器,例如Pusherothers。这样你只需要实现客户端,这非常容易!
            • 如果您想了解更多内容,我发现这些非常有用:(article),(article)tutorial)。
          4. HTML5 WebSockets

            彗星:

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


              

            现在,我应该将哪一个用于实时应用(我需要这样做)   码)。我听过很多关于websockets的事情(有了socket.io [a   node.js library])但为什么不用PHP?

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

答案 1 :(得分:35)

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将是解决这些问题的重要一步,并且作为实时应用程序的平台似乎非常有前景。

答案 2 :(得分:9)

我试图记下这些,并从 java透视收集并编写了示例。

HTTP for Java Developers

Reverse Ajax - Old style

Async Handling on server side

Reverse Ajax - New style

Server Sent Events

将其放在任何正在研究相同主题的Java开发人员处。

答案 3 :(得分:2)

投票

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

  1. 短轮询
  2. 长轮询

短轮询

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

长轮询

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

WebSocket

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

服务器发送的事件 (SSE)

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

彗星

Comet 是一种网络应用程序设计范例,它描述了服务器和网络浏览器之间使用原生 HTTP 方法进行的连续双向交互。彗星是一个总称。 Ajax 推送、HTTP 流和 HTTP 服务器推送是一些可用于提供这种事件驱动交互的 HTTP 机制。

答案 4 :(得分:0)

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

请参见以下示例: Creating a Real-Time Chat App with PHP and Node.js