我有一个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();
?>
答案 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');