服务器发送的事件已停止(以前正在工作)到达浏览器

时间:2015-12-17 04:25:25

标签: javascript php javascript-events

我手上有一点神秘感,并希望得到一些调试帮助。

我有这个脚本:

//------------ 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表具有预期的效果。我看到浏览器的网络日志中没有错误(Iceweasel),并且没有按照我的预期登录到控制台。我甚至可以看到网络日志以我指定的间隔更新SSE。它让我疯了。

我不知道修复(unbreak)这个并且非常感谢你的帮助。

额外信息:

Raspberry Pi 2上的LAMP服务器

Raspbian(Jessie,我想。最新的不论)

浏览器:Iceweasel(firefox)

Pi作为DIY家庭自动化系统的UI和服务器,与Arduino微控制器(目前只有一个)通信,也可以设置为控制灯光,读取传感器等的服务器。来自arduino的数据是发送到MySQL数据库,上面的SSE轮询该数据库以查看是否已在UI中显示最新读数,如果没有将其发送到浏览器并将其更新为已发送。

这是我在这个项目中设置的第一件事,并且直到今天早些时候一直按预期工作。如果我遗漏了任何重要数据,请告诉我,我会立即纠正。

1 个答案:

答案 0 :(得分:0)

解决了它。

将网站归结为div,脚本和PHP文件以及问题仍然存在。

事实证明这是罪魁祸首:

foooter/push

答复的第一部分需要以:

开头

echo "time:" . $event["time"]...

为什么呢?我不确定。我需要更多地了解SSE。

无论如何,问题的根源在于粗心编码。我对另一个功能的预期做了改变,并且没有检查它之后是否仍然有效。然后,我被其他东西所牵制,忘记了我所做的改变。事实上,我并没有保留整个项目的备份。