为什么我使用js服务器发送事件与php看到未指定的sse错误?

时间:2017-11-08 12:17:49

标签: javascript php server-sent-events

我正在建立一个系统,我在其中使用带有php的JS Server-Sent_Events。 它工作正常。但是每次绕过错误事件都会触发一次,我无法理解为什么。

我的JS:

var source = new EventSource("serverSideEvents.php");
source.onmessage = function(event) {
     var data =  $.parseJSON(event.data);
     $(data).each(function(){
            doSomethingWith(this); //works as expected
      });
};

source.onerror = function(event) {
   console.log(event); //fires every few seconds don't know why
};

我的php:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); 

  sendUpdates( );

function sendUpdates() {
  $controller = new someController();
  $out = $controller->Run();
  foreach($out as $msg)
    sendSSEMessage($msg['id'], 'data:'.json_encode($msg));
}

function sendSSEMessage( $id, $data ){
  echo "id: $id \n$data \n\n";
  ob_flush();
  flush();
}

这没关系,在cli或浏览器上php没有抛出任何错误,但每次运行php时js SSE的错误事件都会触发。这是控制台中的错误:

Event {isTrusted: true, type: "error", target: EventSource, currentTarget: EventSource, eventPhase: 2, …}
bubbles:false
cancelBubble:false
cancelable:false
composed:false
currentTarget:
EventSource {url: "http://localhost:7790/serverSideEvents.php", withCredentials: false, readyState: 0, onopen: null, onmessage: ƒ, …}
defaultPrevented:false
eventPhase:0
isTrusted:true
path:[]
returnValue:true
srcElement:EventSource {url: "http://localhost:7790/serverSideEvents.php", withCredentials: false, readyState: 0, onopen: null, onmessage: ƒ, …}
target:EventSource {url: "http://localhost:7790/serverSideEvents.php", withCredentials: false, readyState: 0, onopen: null, onmessage: ƒ, …}
timeStamp:1129162.5250000001
type:"error"
__proto__:Event

要明确:代码按预期工作。我收到了我需要的服务器消息。但也会触发错误事件。

1 个答案:

答案 0 :(得分:0)

好的,想通了,谢谢 sitePoint。 每次连接被服务器关闭时都会触发错误事件,只要脚本终止就会发生这种情况。然后浏览器再次尝试。

所以为了防止这种情况,我们必须保持我们的php活着,将它放入循环并最终由服务器根据php.ini中的max_run_time终止,或者在定义的重新运行次数后自行终止它。 这样做可能有助于减少浏览器重新连接时发生的开销。但请注意,运行脚本(无论是否休眠)会给您的服务器负载带来负担。因此,如果您有许多连接,这可能是不可取的。

当然,我们也可以忽略错误。