3

我有一个为页面“checkMessages.php”触发事件源的javascript。只有在数据库中输入了新内容时,该页面才会返回数据。

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

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

索引.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();
?>
4

2 回答 2

2

EventSource 规范描述了以下内容:

然后必须通过逐行读取所有内容来解析流,其中包含一个 U+000D U+000A (CRLF) 字符对、一个前面没有 U+000D (CR) 字符的单个 U+000A (LF) 字符和一个单个 U+000D (CR) 字符后不跟 U+000A (LF) 字符是行可以结束的方式。

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

  • 如果该行为空(空行):调度事件

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

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

if($k>0)
    echo "data:($k)\n\n";
于 2013-09-16T12:54:45.227 回答
1

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

header('Connection: keep-alive');
于 2013-12-04T11:48:29.213 回答