轮询,Websockets,服务器

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

会有人喜欢向我解释这些技术是什么:

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

    现在,他们中的哪一个应该用于实时应用。 我一直听到很多关于websockets(使用socket.io [一个node.js库]),但为什么不是PHP?


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

    在你理解这些技术之前,你必须首先理解传统的HTTP网络流量。

    常规HTTP:

  • 客户端从服务器请求网页。
  • 服务器计算响应
  • 服务器将响应发送给客户端。
  • HTTP

    Ajax轮询:

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

    Ajax长轮询:

  • 客户端使用常规HTTP从服务器请求网页(请参阅上面的HTTP)。
  • 客户端接收请求的网页并在从服务器请求文件的页面上执行JavaScript。
  • 服务器不会立即响应请求的信息,而是等待有新的信息可用。
  • 当有新的信息可用时,服务器回应新的信息。
  • 客户端收到新信息并立即向服务器发送另一个请求,重新启动该进程。
  • Ajax长轮询

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

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

  • 从服务器到客户端的实时流量,大多数是您需要的
  • 您需要使用具有事件循环的服务器
  • 无法与其他域的服务器连接
  • 如果你想阅读更多,我发现这些非常有用:(文章),(文章),(文章),(教程)。
  • HTML5 SSE

    HTML5 Websockets:

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

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

    彗星:

    Comet是HTML5之前的技术集合,它使用流和长轮询实现实时应用程序。 阅读更多关于维基百科或这篇文章。


    现在,他们中的哪一个应该用于实时应用程序(我需要编码)。 我一直听到很多关于websockets(使用socket.io [一个node.js库]),但为什么不是PHP?

    你可以使用PHP和WebSockets,看看棘轮。


    Tieme在他的优秀答案中付出了很多努力,但我认为OPs的核心问题是这些技术如何与PHP相关联,而不是每种技术如何工作。

    除了明显的客户端html,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)和线程(比如pthread),但是很少有应用程序使用这些扩展。

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

    PHP 7将是解决这些问题的一个很好的步骤,并且作为实时应用程序的平台看起来很有前景。


    我试图记下这些,并从java的角度收集和编写示例。

    适用于Java开发人员的HTTP

    反向Ajax - 旧式

    服务器端的异步处理

    反向Ajax - 新风格

    服务器发送的事件

    把它放在任何正在研究相同主题的Java开发人员。

    链接地址: http://www.djcxy.com/p/9851.html

    上一篇: Polling, Websockets, Server

    下一篇: What does "++" mean in PHP?