2009-06-03 57 views
12

我是否需要传回任何HTTP标头以告诉浏览器我的服务器不会立即关闭连接并在收到HTML时显示?是否有必要让HTML像flush()一样增量显示?如何长时间递增地向浏览器显示HTML?

此技术曾用于聊天等事情,但我正在考虑将它用于COMET类型的应用程序。

回答

14

Long polling是一种常见的技术来做这样的事情;简单地总结一下,它的工作原理如下:

  1. 客户端发送一个XHR到服务器。

    • 如果数据准备就绪,服务器立即返回。
    • 如果没有,服务器会保持连接处于打开状态,直到数据变为可用状态,然后返回该状态。
    • 如果请求超时,回到1)。
  2. 客户端上运行的页面接收到这些数据,并执行它的操作。

  3. 回到1)

这就是Facebook如何implements its chat feature

This article也清除了长轮询的一些误解,并详细说明了这样做的一些好处。

0

根据你在做什么,你可以在你的脚本进行时回声,然后这个html会回传给浏览器。

1

我认为一个更强大的解决方案是一个带有Javascript计时器的页面,该计时器轮询服务器以获取新数据。保持响应打开不是HTTP协议设计的。

+0

在发布我的文章后,我看到了这个,肯定是更好的答案,你可以有一个DIV,你可以使用JavaScript继续填充一些AJAX内容 – bdwakefield 2009-06-03 13:24:23

+0

Polling会对于像聊天这样的事情来说,这是一个非常糟糕的解决方案,其中暂停可能会有很大差异,并且您希望响应快速出现但是同时避免了数千客户经常进行民意调查而给服务器造成负担,而这些客户大多数时间都没有返回任何东西。使用HTTP协议的东西不是为工作而设计的,在这种情况下是更好的解决方案。 – 2009-06-03 13:31:54

1

我只是回应/打印HTML,因为我去了。有几种不同的方式可以让脚本在发送下一个位之前暂停。您不需要使用标头或任何特殊代码来做任何事情来告诉浏览器等待。只要脚本仍在运行,它将呈现从脚本接收到的HTML。

echo "<HTML><HEAD.../HEAD><BODY>"; 
while (running) 
{ 
    echo "printing html... </br>"; 
} 
echo "</BODY></HTML>"; //all done 
0

我建议你调查使用Ajax而不是普通的旧HTML来实现这样的功能。这允许您在架构设计和用户界面方面拥有更大的灵活性

2

当客户端在一段时间内没有收到任何数据时,它将关闭连接。这个超时不能被HTTP标头影响。它是客户特定的,通常设置为120秒IIRC。

所以你所要做的就是定期发送少量数据以避免超时。

1

尝试永远框架(例如在Gmail中)

这些工艺的所有都只是黑客,HTTP不是设计来做到这一点。

1

在脚本的末尾,使用这样的(假设你已经输出通过在页面顶部

<?php 

set_time_limit(0); // Stop PHP from closing script after 30 seconds 

ob_start(); 

echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string 

$buffer = ob_get_clean(); 

while (isset($buffer[0])) { 

$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D 
$buffer = substr($buffer, 1024 * 30); // Shorten buffer 

echo $send; // Send buffer 
echo '<br />'; // forces browser to reload contents some how :P 

ob_flush(); // Flush output to browser 
flush(); 

sleep(1); // Sleep for 1 second 

} 

?> 

该脚本主要输出在30kbs 1兆字节的文字把ob_start()缓冲上(模拟)无论用户和服务器的连接速度有多快

相关问题