如何在很长一段时间内逐步向浏览器显示HTML?

时间:2009-06-03 13:08:39

标签: php xmlhttprequest comet

我是否需要传回任何HTTP标头告诉浏览器我的服务器不会立即关闭连接并在收到HTML时显示?是否有必要让HTML逐步显示为flush()?

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

8 个答案:

答案 0 :(得分:14)

Long polling是做这样事情的常用技巧;简要总结一下,它的工作原理如下:

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

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

  3. 回到1)
  4. 这就是Facebook implements its chat feature

    This article也清除了一些长期民意调查的误解,并详细说明了这样做的一些好处。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我会像往常一样回显/打印HTML。在发送下一位之前,有几种不同的方法可以使脚本暂停。你不应该对标题或任何特殊代码做任何事情来告诉浏览器等待。只要您的脚本仍在运行,它就会呈现从脚本中收到的HTML。

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

答案 4 :(得分:1)

永远尝试框架(如在gmail中)

所有这些技术都只是黑客攻击,http不是为此而设计的。

答案 5 :(得分:1)

在脚本的末尾,使用类似的东西(假设您通过将ob_start()放在页面顶部来输出缓冲

<?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兆字节的文本。

答案 6 :(得分:0)

根据您的操作,您可以在脚本继续进行回显,然后在回显时将html发送到浏览器。

答案 7 :(得分:0)

我建议您使用Ajax调查实现此类功能,而不是普通的旧HTML。这使您在架构设计和用户界面方面具有更大的灵活性