JavaScript SSE无法使用Firefox

时间:2013-09-14 09:56:41

标签: javascript php html5 server-sent-events

我有一个javascript,它会触发“checkMessages.php”页面的EventSource。 仅当数据库中输入了新内容时,该页面才会返回数据。

这里的问题在于Mozilla Firefox,因为只要数据库发生任何变化,它就不会更新SSE内容。我使用谷歌浏览器检查了相同的内容,一切正常。

此外,我在Firefox中检查了来自http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_sse的HTML5 SSE演示,并且它可以正常工作。那么这段代码出了什么问题?

的index.php:

<script type="text/javascript">
if(typeof(EventSource)!="undefined")
{  
  var source=new EventSource("checkMessages.php");
  source.onmessage=function(event)
  {
        $("#new_message").html("Inbox"+event.data);
  }
}
else
{ 
        $("#new_message").html("HTML5 not supported");
}

</script>

<div id="new_message_container">
    <span id="new_message" onclick="readInbox($userid)">
        Inbox
    </span>
</div>

checkMessages.php:

<?php
session_start();
require_once 'myfunctions.php';
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$userid=studentidOf($_SESSION['user']);
$query="Select msgby from messages where msgfor='$userid'";
$result=queryMysql($query);
$k=mysql_num_rows($result);

if($k>0)
    echo "data:($k)";

flush();
?>

2 个答案:

答案 0 :(得分:1)

EventSource specification描述了以下内容:

  

然后必须通过逐行读取所有内容来解析流,   使用U + 000D U + 000A(CRLF)字符对,   单个U + 000A(LF)字符前面没有U + 000D   (CR)字符和单个U + 000D   (CR)字符后面没有U + 000A(LF)字符   一条线可以结束的方式。

  

必须按照收到的顺序处理行,如下所示:

     
      
  • 如果该行为空(空行):发送事件
  •   

这意味着如果事件数据后面没有空行,则不会调度该事件。

上面PHP代码的修复是为了确保数据行正确终止并引入新的空行:

if($k>0)
    echo "data:($k)\n\n";

答案 1 :(得分:1)

我遇到了同样的问题,添加1个标题似乎解决了Firefox问题。

header('Connection: keep-alive');