高效地重新加载数据/将数据从服务器推送到客户端

时间:2013-04-20 17:01:48

标签: php javascript stream client-server comet

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

enter image description here

最终应用程序中的数据流不同。这些行必须从服务器重新加载新的最新数据。

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

我查看了Node.js,但似乎主机无法实现。

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

如果没有,当有多个数据流必须在一秒钟内重新加载时,然后会是什么样的?

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

我认为它没有任何重要性,但我在后端使用PHP5.3,在前端使用jQuery 1.9.1的JavaScript。

2 个答案:

答案 0 :(得分:8)

这个问题已被多次询问,但方式略有不同。以下是一些值得一读的参考文献:

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

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

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

另见realtime web technology guide

答案 1 :(得分:2)

我认为你所寻找的通常被称为Comet。这种技术经常被用来做如下工作:

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

数据确实通常作为JSON传输,但您可以选择您想要的任何编码。有关如何执行此操作的示例,请参阅hereGoosh是此技术的另一个示例,Interactive Python Shell也是如此。所有的代码都可用。


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

getNewData.php中,您需要等待事件并返回数据。您不希望为此使用轮询,但有些PHP库允许用户使用各种进程间通信策略来等待事件,请参阅this question for instancegetNewData.php的高级伪代码如下所示:

  1. 解析JSON请求
  2. 输入有效的等待状态(有超时),等待“新数据可用”事件
  3. 上一步是否超时?
    是:发送表示无数据的响应
    否:发送新数据回复