长轮询/ HTTP流媒体一般问题

时间:2011-08-27 09:05:34

标签: php jquery comet long-polling http-streaming

我正在尝试使用创建一个理论网络聊天应用程序,我已经阅读了有关长轮询和http流的内容,并且我设法应用了文章中介绍的大多数原则。然而,有两个主要的事情我仍然无法理解。

长轮询

  • 服务器如何知道何时发送更新?是否需要不断查询数据库,还是有更好的方法?

使用HTTP Streaming

  • 如何在Ajax连接期间检查结果是否仍然有效?我知道jQuery的success函数用于ajax调用,但是如何检查数据,而连接仍然在进行?

我会感激任何和所有答案,提前谢谢。

2 个答案:

答案 0 :(得分:25)

答案 1 :(得分:5)

  

如何在Ajax连接期间检查结果是否仍然有效?我知道jQuery的ajax调用成功函数,但是如何在连接仍在进行时检查数据?

实际上,你可以。我已经为上述内容提供了修改后的答案,但我不知道它是否仍在等待或被忽略。在此提供更新,以便提供正确的信息。

如果您打开客户端和服务器之间的连接,则可以推送附加到响应的更新。每次更新都会导致XMLHttpRequest.onreadystatechange事件被触发,XMLHttpRequest.readyState的值将为3.这意味着XMLHttpRequest.responseText会继续增长。

你可以在这里看到一个例子: http://www.leggetter.co.uk/stackoverflow/7213549/

要查看JS代码,只需查看源代码即可。 PHP代码是:

<?php
$updates = $_GET['updates'];
if(!$updates) {
  $updates = 100;
}

header('Content-type: text/plain');
echo str_pad('PADDING', 2048, '|PADDING'); // initial buffer required

$sleep_time = 1;
$count = 0;
$update_suffix = 'Just keep streaming, streaming, streaming. Just keep streaming.';
while($count < 100) {
  $message = $count . ' >> ' . $update_suffix;
  echo($message);
  flush();
  $count = $count + 1;
  sleep($sleep_time);
}
?>

在基于Gecko的浏览器(如Firefox)中,可以使用responseText完全替换multipart/x-mixed-replace。我没有举例说明这一点。

使用jQuery.ajax看起来不可能实现相同类型的功能。每当success事件被触发时,onreadystatechange回调都不会触发。这是令人惊讶的,因为文档说明:

  

但是,没有提供onreadystatechange机制,因为成功,错误,完整和statusCode涵盖了所有可能的要求。

所以文档可能是错误的,除非我误解了它?

您可以在此处看到尝试使用jQuery的示例: http://www.leggetter.co.uk/stackoverflow/7213549/jquery.html

如果您查看Firebug或Chrome开发者工具中的网络标签,您会看到stream.php的文件大小在增长,但success回调仍然没有消息。