SSE无法保持连接

时间:2014-12-13 19:23:07

标签: php html5 server-sent-events php-5.4

我想编写一个实时服务器日志查看器,并且只是了解了SSE。我很困惑如何正确使用它。我正在使用php 5.4运行Linux服务器。我现在有这个代码:

HTML + JS:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <ul id='el'></ul>
    <script type="text/javascript">
        var eSource = new EventSource("ssedemo.php");
        eSource.onmessage = function(event) {
            var e = document.createElement("li");
            e.innerHTML = event.data;
            document.getElementById('el').appendChild(e);
        };
    </script>
</body>
</html>

PHP:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();
?>

这样可行,但每次更新后都会断开连接,并且客户端每隔3秒重新建立一次连接。我希望它能更快地更新。从在线文档和教程中,似乎使用SSE的正确方法是将服务器代码包装在循环中以维持连接,并使用sleep来控制更新时间:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true) {
    $time = date('r');
    echo "data: The server time is: {$time}\n\n";
    ob_flush();
    flush();
    sleep(1);
};
?>

问题是这不起作用。每当我引入循环时,永远不会在客户端调用onmessage。我尝试了很多例子而没有改变任何代码(https://github.com/html5rocks/www.html5rocks.com/tree/master/content/tutorials/eventsource/basics/static/demo),(https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events)等,但除非我从php中删除循环,否则它们都不起作用。

为什么我不能保持连接?在PHP 5.4中有什么变化可以阻止它工作吗?

1 个答案:

答案 0 :(得分:1)

首先回答你的上一个问题,php 5.4没有任何改变可以阻止这项工作。

一切看起来都对我不对。而不是onmessage我总是这样使用它:

eSource.addEventHandler('message', function(event) {
  var e = document.createElement("li");
  e.innerHTML = event.data;
  document.getElementById('el').appendChild(e);
}, false);

但我认为无论哪种方式都没问题。 (确认您说没有while循环时它可以工作,并且只发送一个数据包。)

所以,我所能做的就是提供一些故障排除的想法:

您可以使用Firebug或Chrome开发者控制台查看连接正在做什么吗?

你是否看到它立即被关闭(这意味着一些语法错误或PHP脚本中的其他崩溃),或者它是否永远保持打开但是没有接收任何数据(这意味着存在服务器端缓存,或者一个中间代理服务器缓存),或者它是否永远保持打开状态,并接收数据(这表明你的JavaScript有问题)。

同时检查JS控制台是否有任何警告,并检查服务器端PHP错误日志中是否有警告。