8

在将数据从 Web 服务器重新加载到前端时,我正在寻找“可行的方法”(即最有效、最常用、普遍接受的方式)。在最终应用程序中,我将有几个必须写入数据的输出字段,例如:

在此处输入图像描述

最终应用程序中的数据流将彼此不同。必须使用来自服务器的最新数据重新加载这些行。

我一直在考虑使用 Ajax 请求像每秒一样更新,但必须有另一种方法来做到这一点。Ajax 请求会造成大量的数据流量。此外,使用 Facebook 聊天时,您不必每秒钟都等待,聊天几乎是立即收到的。然而,当我使用 Mozilla Firefox 的开发人员工具时,我没有看到任何 Ajax 轮询请求。这让我想到是否会有不同的方法来做到这一点。

我已经研究过 Node.js,但我的主机似乎无法做到这一点。

我听说有人在谈论 Ajax Push,我应该使用它吗?如果是这样,你能给我一个基本的用法示例吗?

如果不是,那么当有多个数据流必须在一秒钟内重新加载时,该怎么办?

要求是速度低数据流量。因此,我认为,连续轮询服务器不是一种选择,因为这会产生巨大的开销。

我认为这并不重要,但我在后端使用 PHP5.3,在前端使用带有 jQ​​uery 1.9.1 的 JavaScript。

4

2 回答 2

8

这个问题已经被问过很多次了,但方式略有不同。以下是一些值得一读的参考资料:

总之:如果您正在考虑在 Apache 上使用 PHP 构建您的解决方案,那么保持打开的持久连接(HTTP 长轮询或流式传输)将很快耗尽资源(效率非常低)。因此,您最好使用托管解决方案(*免责声明 - 我为托管解决方案工作)。

HTTP-Long polling 和 HTTP Streaming 是已经被 Server-Sent Events 和 WebSockets 取代的解决方案。因此,在可能的情况下(在 Web 客户端提供支持的情况下),您应该在回退到基于 HTTP 的解决方案之前使用这些解决方案之一。一个好的实时网络技术会自动为你处理这个问题。

由于您的图表显示您正在订阅多个数据流,您还应该考虑一个自然适合此的发布/订阅解决方案。同样,一个好的实时网络技术解决方案将为您提供这一点。

另请参阅实时网络技术指南

于 2013-04-23T14:20:06.817 回答
2

我认为您正在寻找的通常称为Comet。这种技术通常适用于以下情况:

  • 客户端(Web 浏览器)向服务器发出请求以获取新数据。这不是重新加载页面,而是在 JavaScript 中完成
  • 当服务器有一些数据给客户端时,服务器会响应请求。同样,这不会影响 UI,因为重新加载的不是页面本身:数据的加载是在 JavaScript 代码中“在后台”完成的。
  • 在服务端,请求等待新数据,并在可用时返回新数据,或者如果达到超时间隔(在服务器上定义)则不返回任何内容。此超时通常设置为低于浏览器 HTTP 超时。这样做的原因是服务器可以知道特定客户端是否获得了特定数据。如果在客户端允许请求超时,那么在客户端超时后,原始请求可能会被服务器响应,并且客户端不会得到数据,即使服务器认为它确实如此。

数据确实通常以 JSON 格式传输,但您可以选择您喜欢的任何编码。有关如何执行此操作的示例,请参见此处。Goosh是这种技术的另一个例子,Interactive Python Shell也是如此。所有人的代码都可用。


在 PHP 方面,您需要创建一个页面来响应这些“后台”JavaScript Comet 请求。它可能与用户加载的页面相同,但为了便于解释,我们假设它不同。因此,用户加载index.php并调用 JavaScript Comet 代码getNewData.php以检索新数据。

在您的getNewData.php情况下,您将需要等待您的事件并返回数据。您不想为此使用轮询,但有一些 PHP 库允许使用各种进程间通信策略来等待事件,例如参见这个问题。您的高级伪代码getNewData.php如下所示:

  1. 解析 JSON 请求
  2. 进入高效的等待状态(有超时),等待你的“新数据可用”事件
  3. 上一步是否超时?
    是:发送指示无数据
    的响应 否:发送带有新数据的响应
于 2013-04-22T18:17:45.440 回答