首页 文章

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

提问于
浏览
905

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

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

  • 长轮询

  • 服务器发送的事件

  • Websockets

  • 彗星

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

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

3 回答

  • 34

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

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

    常规HTTP:

    • 客户端从服务器请求网页 .

    • 服务器计算响应

    • 服务器将响应发送给客户端 .

    HTTP

    Ajax轮询:

    • 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .

    • 客户端接收所请求的网页并在页面上执行JavaScript,该JavaScript以规则的间隔(例如0.5秒)从服务器请求文件 .

    • 服务器计算每个响应并将其发回,就像普通的HTTP流量一样 .

    Ajax Polling

    Ajax Long-Polling:

    • 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .

    • 客户端接收请求的网页并在页面上执行JavaScript,该页面从服务器请求文件 .

    • 服务器不会立即响应所请求的信息,而是等待有可用的 new 信息 .

    • 当有新信息可用时,服务器会使用新信息进行响应 .

    • 客户端收到新信息并立即向服务器发送另一个请求,重新启动该过程 .

    Ajax Long-Polling

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

    • 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP) .

    • 客户端收到请求的网页,并在页面上执行JavaScript,打开与服务器的连接 .

    • 当有新信息可用时,服务器向客户端发送事件 .

    • 从服务器到客户端的实时流量,主要是's what you'll需要的

    • 您将要使用具有事件循环的服务器

    • 无法与其他域的服务器连接

    • 如果你想了解更多,我发现这些非常有用:(article)(article)(article)(tutorial) .

    HTML5 SSE

    HTML5 Websockets:

    • 客户端使用常规http从服务器请求网页(请参阅上面的HTTP) .

    • 客户端收到请求的网页,并在页面上执行JavaScript,打开与服务器的连接 .

    • 当新数据(任何一方)可用时,服务器和客户端现在可以相互发送消息 .

    • 从服务器到客户端 and 从客户端到服务器的实时流量

    • 您将要使用具有事件循环的服务器

    • 使用WebSockets,可以从另一个域连接服务器 .

    • 也可以使用第三方托管的websocket服务器,例如Pusherothers . 这样你只需要实现客户端,这很容易!

    • 如果你想了解更多,我发现这些非常有用:(article),(article)tutorial) .

    HTML5 WebSockets

    Comet:

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


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

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

  • 8

    我试图记下这些并收集并编写了一份来自 java perspective 的例子 .

    HTTP for Java Developers

    Reverse Ajax - Old style

    Async Handling on server side

    Reverse Ajax - New style

    Server Sent Events

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

  • 1900

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

相关问题