我是否需要传回任何HTTP标头告诉浏览器我的服务器不会立即关闭连接并在收到HTML时显示?是否有必要让HTML逐步显示为flush()?
这种技术曾经用于聊天等事情,但我正在考虑将它用于COMET类型的应用程序。
答案 0 :(得分:14)
Long polling是做这样事情的常用技巧;简要总结一下,它的工作原理如下:
客户端将XHR发送到服务器。
客户端上运行的页面会接收此数据,并使用它执行的操作。
这就是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。这使您在架构设计和用户界面方面具有更大的灵活性