2017-11-08 16 views
0

私は、JS Server-Sent_EventsをPHPで使用するシステムを設定しています。 それはうまく動作します。しかし、すべてのエラーイベントの回りに1回起動され、私は理由を理解できません。js serverを使用して不特定のsseエラーが表示されるのはなぜですか?

マイ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(); 
} 

これは、[OK]を作品は、CLIまたはブラウザ上でPHPがエラーをスローしていない、まだJS SSEのエラーイベントが毎回発射phpが実行されます。これはコンソールでのエラーです。

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 

明確になる:コードは期待通りに機能します。私は必要なサーバーメッセージを取得します。エラーイベントもトリガされます。

+0

多分CORSの問題ですか? –

答えて

0

sitePointのおかげで、わかりました。 エラーイベントは、サーバーによって接続が閉じられるたびに発生します。これは、スクリプトが終了するたびに発生します。ブラウザは次に再試行します。

これを防ぐには、PHPをループにして、php.iniのmax_run_timeに従ってサーバーで終了させるか、定義した回数の再実行後に終了させる必要があります。 これを行うと、ブラウザの再接続時に発生するオーバーヘッドを減らすのに役立ちます。しかし、スクリプトの実行(スリープ状態かどうか)がサーバー負荷に負担をかけることに注意してください。だからあなたは多くの接続がある場合、これはお勧めできないかもしれません。

もちろん、エラーを無視することもできます。

関連する問題