服务器发送的事件停止(以前工作)到达浏览器
Server sent events stopped (was previously working) reaching the browser
我手上有一些谜团,如果能帮我调试一下,我将不胜感激。
我有这个脚本:
//------------ Server sent event stream for sensor events----------------
var evtSource = new EventSource("event_manager.php");
evtSource.onmessage = function(e)
{
var newElement = document.createElement("li");
console.log(e.data);
newElement.innerHTML = e.data;
eventList.appendChild(newElement);
//------------ Splits received event data for further use ----------------
var split_data = e.data.split(" ");
if (split_data[3] == "Potentiometer")
{
document.getElementById("livingRoomTemp").innerHTML = split_data[4] + "°";
}
//------------ Keeps event list scrolled to the latest event ----------------
var objDiv = document.getElementById("eventBar");
objDiv.scrollTo(0, objDiv.scrollHeight);
}
用这个 PHP 文件打开一个事件流:
<?php
header("Content-Type: text/event-stream\n\n");
require("../includes/config.php");
while (1) {
$rows = query("SELECT * FROM `event_log` WHERE `displayed` = 0");
foreach ($rows as $event)
{
echo "time:" . $event["time"] . "controller:" . $event["controller"] . "sensor:" .$event["sensor"] . "data:" .$event["data"] . " " ."\n\n";
query("UPDATE `event_log` SET `displayed` = 1 WHERE `id` = ?", $event["id"]);
}
ob_end_flush();
flush();
sleep(1);
}
?>
所有这一切之前都运行良好,据我所知,我没有对任何部分进行任何更改,但由于某种原因,我的 .onmessage
函数不再执行。
我可以卷入事件流 PHP 文件并观察它按预期工作,将 echo
发送到我的终端,但无论出于何种原因,浏览器什么都不做。您在那里看到的 query
函数只是向 MySQL 发送一个 SQL 查询。 SSE 显然是 运行,因为查询函数对 MySQL table 具有预期效果。我在浏览器 (Iceweasel) 的网络日志中没有看到任何错误,也没有像我期望的那样向控制台发送日志。我什至可以看到网络日志以我指定的时间间隔更新 SSE。这让我发疯。
我不知道如何解决(破解)这个问题,非常感谢您的帮助。
额外信息:
LAMP 服务器位于 Raspberry Pi 2
Raspbian(Jessie,我觉得。不管最新的)
浏览器:Iceweasel (firefox)
Pi 既可以作为 UI 也可以作为 DIY 家庭自动化系统的服务器,该系统与 Arduino 微控制器(目前只有一个)进行通信,这些微控制器也被设置为控制灯光、读取传感器等的服务器。来自 arduino 的数据被发送到 MySQL 数据库,上面的 SSE 轮询该数据库以查看最新读数是否已显示在 UI 中,如果没有,则将其发送到浏览器并将其更新为已发送。
这是我在这个项目中首先设置的东西之一,并且一直按预期工作,直到今天早些时候。如果我遗漏了任何重要数据,请告诉我,我会立即纠正。
解决了。
除了一个 div、脚本和 PHP 文件,把网站拆成一无所有,问题仍然存在。
原来这是罪魁祸首:
echo "time:" . $event["time"]...
响应的第一部分需要以:
开头
echo "data:" . $event["time"]...
为什么?我不确定。我需要更多地学习 SSE。
无论如何,这里问题的根源是粗心的编码。我对另一个功能的预期进行了更改,但没有检查它之后是否仍然有效。然后我被其他事情分散了注意力,忘记了我所做的改变。由于我没有保留整个项目备份这一事实使情况更加复杂。
我手上有一些谜团,如果能帮我调试一下,我将不胜感激。
我有这个脚本:
//------------ Server sent event stream for sensor events----------------
var evtSource = new EventSource("event_manager.php");
evtSource.onmessage = function(e)
{
var newElement = document.createElement("li");
console.log(e.data);
newElement.innerHTML = e.data;
eventList.appendChild(newElement);
//------------ Splits received event data for further use ----------------
var split_data = e.data.split(" ");
if (split_data[3] == "Potentiometer")
{
document.getElementById("livingRoomTemp").innerHTML = split_data[4] + "°";
}
//------------ Keeps event list scrolled to the latest event ----------------
var objDiv = document.getElementById("eventBar");
objDiv.scrollTo(0, objDiv.scrollHeight);
}
用这个 PHP 文件打开一个事件流:
<?php
header("Content-Type: text/event-stream\n\n");
require("../includes/config.php");
while (1) {
$rows = query("SELECT * FROM `event_log` WHERE `displayed` = 0");
foreach ($rows as $event)
{
echo "time:" . $event["time"] . "controller:" . $event["controller"] . "sensor:" .$event["sensor"] . "data:" .$event["data"] . " " ."\n\n";
query("UPDATE `event_log` SET `displayed` = 1 WHERE `id` = ?", $event["id"]);
}
ob_end_flush();
flush();
sleep(1);
}
?>
所有这一切之前都运行良好,据我所知,我没有对任何部分进行任何更改,但由于某种原因,我的 .onmessage
函数不再执行。
我可以卷入事件流 PHP 文件并观察它按预期工作,将 echo
发送到我的终端,但无论出于何种原因,浏览器什么都不做。您在那里看到的 query
函数只是向 MySQL 发送一个 SQL 查询。 SSE 显然是 运行,因为查询函数对 MySQL table 具有预期效果。我在浏览器 (Iceweasel) 的网络日志中没有看到任何错误,也没有像我期望的那样向控制台发送日志。我什至可以看到网络日志以我指定的时间间隔更新 SSE。这让我发疯。
我不知道如何解决(破解)这个问题,非常感谢您的帮助。
额外信息:
LAMP 服务器位于 Raspberry Pi 2
Raspbian(Jessie,我觉得。不管最新的)
浏览器:Iceweasel (firefox)
Pi 既可以作为 UI 也可以作为 DIY 家庭自动化系统的服务器,该系统与 Arduino 微控制器(目前只有一个)进行通信,这些微控制器也被设置为控制灯光、读取传感器等的服务器。来自 arduino 的数据被发送到 MySQL 数据库,上面的 SSE 轮询该数据库以查看最新读数是否已显示在 UI 中,如果没有,则将其发送到浏览器并将其更新为已发送。
这是我在这个项目中首先设置的东西之一,并且一直按预期工作,直到今天早些时候。如果我遗漏了任何重要数据,请告诉我,我会立即纠正。
解决了。
除了一个 div、脚本和 PHP 文件,把网站拆成一无所有,问题仍然存在。
原来这是罪魁祸首:
echo "time:" . $event["time"]...
响应的第一部分需要以:
开头echo "data:" . $event["time"]...
为什么?我不确定。我需要更多地学习 SSE。
无论如何,这里问题的根源是粗心的编码。我对另一个功能的预期进行了更改,但没有检查它之后是否仍然有效。然后我被其他事情分散了注意力,忘记了我所做的改变。由于我没有保留整个项目备份这一事实使情况更加复杂。