2015-08-25 11 views
7

Jestem nowy na SSE i śledzę numer w3schools tutorial. Dodałem kod do ich przykładu, dzięki czemu mogę zobaczyć, kiedy połączenie jest otwarte i kiedy pojawia się jakiś błąd. Tu jest mój kodu:Zdarzenia wysyłane przez serwer HTML5 onerror pojawiają się co 3 sekundy.

<script> 
var source = new EventSource("sse.php");       
source.addEventListener('message', function(e) { 
    console.log("onmessage");   
    document.getElementById("result").innerHTML += event.data + "<br>";  
}, false); 

source.addEventListener('open', function(e) { 
    console.log("onopen"); 
}, false); 

source.addEventListener('error', function(e) { 
    console.log('error '+e.readyState); 
}, false); 

</script> 

A mój kod po stronie serwera:

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

$time = date('r'); 
echo "data: The server time is: {$time}\n\n"; 
flush(); 
?> 

Dokumentacja mówi, że

Zdarzenie serwera wysyłany jest wtedy, gdy strona internetowa automatycznie pobiera aktualizacje z serwer. Było to również możliwe przed, , ale strona internetowa musiałaby zapytać, czy dostępne są jakieś aktualizacje. W przypadku zdarzeń wysłanych przez serwer aktualizacje są automatycznie wysyłane.

Ale konsola pokazuje nam coś przeciwnego:

enter image description here

stronie klienta żąda nowego połączenia, otrzymuję komunikat, błąd występuje, a połączenie zostanie zamknięte. Powtarza się to co 3 sekundy. Dlaczego to się dzieje?

Odpowiedz

1

Podejrzewam, że implementacja po stronie serwera nie powoduje otwarcia połączenia HTTP. W związku z tym ponownie się łączy.

Nie piszę PHP, ale every example Znalazłem zastosowania ob_flush() oprócz flush().

ob_flush(); 
flush(); 

Czy próbowałeś tego?