我想编写一个实时服务器日志查看器,并且只是了解了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中有什么变化可以阻止它工作吗?
答案 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错误日志中是否有警告。