提问



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


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



  1. 长轮询

  2. 服务器发送的事件

  3. 的WebSockets

  4. 彗星



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


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

最佳参考


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


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


常规HTTP:




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

  2. 服务器计算响应

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






Ajax轮询:




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

  2. 客户端收到请求的网页并在页面上执行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. 当有新信息可用时,服务器会向客户端发送一个事件。



    • 从服务器到客户端的实时流量,主要是你需要的

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

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

    • 如果你想阅读更多,我发现这些非常有用:(文章),(文章),(文章),(教程)。




[1] [2] [3] [4]


HTML5 Websockets:




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

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

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



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

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

    • 使用WebSockets,可以与另一个域的服务器连接。

    • 也可以使用第三方托管的websocket服务器,例如Pusher或其他服务器。这样你就只需要实现客户端,这非常简单!

    • 如果你想了解更多,我发现这些非常有用:(文章),(文章)(教程)。




[5] [6] [7] [8] [9]


彗星:



Comet是HTML5之前的一系列技术,它们使用流式传输和长轮询来实现实时应用。阅读更多关于维基百科或本文的内容。[10] [11]






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



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

其它参考1


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


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


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


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


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


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

其它参考2


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


用于Java开发人员的HTTP [13]


反向Ajax - 旧式[14]


服务器端的异步处理[15]


反向Ajax - 新风格[16]


服务器发送事件[17]


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