Sto cercando di fare i conti con gli eventi lato server, dato che si adattano perfettamente alle mie esigenze e sembrano come dovrebbero essere semplici da implementare, tuttavia non riesco a superare un errore vago e quello che sembra che la connessione venga ripetutamente chiusa e riaperto. Tutto ciò che ho provato è basato su this e altri tutorial.Creazione di prototipi HTML5 Server-Sent Events - errore ambiguo e polling ripetuto?
Il PHP è un singolo script:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
?>
e il codice JavaScript assomiglia a questo (eseguito su carico del corpo):
function init() {
var source;
if (!!window.EventSource) {
source = new EventSource('events.php');
source.addEventListener('message', function(e) {
document.getElementById('output').innerHTML += e.data + '<br />';
}, false);
source.addEventListener('open', function(e) {
document.getElementById('output').innerHTML += 'connection opened<br />';
}, false);
source.addEventListener('error', function(e) {
document.getElementById('output').innerHTML += 'error<br />';
}, false);
}
else {
alert("Browser doesn't support Server-Sent Events");
}
}
Ho cercato un po 'intorno, ma non riesce a trovare le informazioni su
- Se Apache necessita di una configurazione speciale per supportare eventi inviati dal server e
- Come posso avviare un push dal server con questo tipo di configurazione (ad es. posso semplicemente eseguire lo script PHP dalla CLI per dare una spinta al browser già connesso?)
Se eseguo questo JS in Chrome (16.0.912.77) apre la connessione, riceve l'ora, quindi errori (senza informazioni utili nell'oggetto error), quindi ricollega in 3 secondi e passa attraverso lo stesso processo. In Firefox (10.0) ottengo lo stesso comportamento.
EDIT 1: Ho pensato che il problema potesse essere correlato al server che stavo usando, quindi ho provato su un'installazione XAMPP vanilla e lo stesso errore si è verificato. Una configurazione di base del server dovrebbe essere in grado di gestirlo senza modifiche/configurazione aggiuntiva?
EDIT 2: Il seguente è un esempio di output dal browser:
connection opened
server time: 01:47:20
error
connection opened
server time: 01:47:23
error
connection opened
server time: 01:47:26
error
qualcuno può dirmi dove questo sta andando male? Le esercitazioni che ho visto fanno sembrare che l'SSE sia molto semplice. Anche eventuali risposte alle mie due domande numerate sopra sarebbero davvero utili.
Grazie.
puoi pubblicare il tuo cronometro, il codice fornito è privo di errori. Si rilascia l'oggetto EventSource in qualsiasi momento? –
@tnt Non potrò postare il codice fino a lunedì, ma non esiste un ciclo a tempo - il comportamento predefinito di EventSource è di riconnettersi 3 secondi dopo la perdita della connessione. Una singola funzione (init(), sopra) viene chiamata una volta sul carico del corpo che crea la connessione, quindi il browser inserisce il suo ciclo di connessione-errore-riconnessione tutto da solo. – tomfumb
Da W3C: i server proxy legacy sono noti per, in alcuni casi, rilasciare connessioni HTTP dopo un breve timeout. Per proteggersi da tali server proxy, gli autori possono includere una riga di commento (una che inizia con un carattere ':') ogni 15 secondi circa. –