1139

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

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

  1. 长轮询
  2. 服务器发送的事件
  3. 网络套接字
  4. 彗星

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

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

4

4 回答 4

2211

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

在了解这些技术之前,您必须先了解经典的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) / 事件源:

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

HTML5 上交所

HTML5 网络套接字:

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

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

HTML5 网络套接字

彗星:

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


现在,我应该将其中哪一个用于实时应用程序(我需要编码)。我听说过很多关于 websockets(使用 socket.io [a node.js library])的消息,但为什么不是 PHP 呢?

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

于 2012-10-12T08:57:44.533 回答
42

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

除了明显的客户端 HTML、CSS 和 Javascript,PHP 是 Web 开发中最常用的语言。然而,当涉及到实时应用程序时,PHP 有两个主要问题:

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

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

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

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

于 2014-10-14T07:11:26.410 回答
8

轮询

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

  1. 短轮询
  2. 长轮询

短轮询

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

长轮询

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

网络套接字

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

服务器发送事件 (SSE)

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

彗星

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

于 2021-05-30T06:27:00.180 回答
1

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

请参阅此示例: 使用 PHP 和 Node.js 创建实时聊天应用程序

于 2019-04-14T16:38:16.260 回答