Tutti,
HTML5 Rocks ha un bel tutorial per principianti sugli eventi inviati dal server (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Ma non capisco un concetto importante: cosa attiva l'evento sul server che causa l'invio di un messaggio?
In altre parole, nell'esempio HTML5, il server invia semplicemente un timestamp una volta :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
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()));
Se stavo costruendo un esempio pratico, ad esempio un "muro" in stile Facebook o un ticker di borsa, in cui il server "spinge" un nuovo messaggio al client ogni volta che qualche dato cambia, come funziona?
In altre parole ... Lo script PHP ha un ciclo che viene eseguito continuamente, controllando un cambiamento nei dati, quindi inviando un messaggio ogni volta che ne trova uno? In tal caso, come fai a sapere quando terminare il processo?
Oppure - lo script PHP invia semplicemente il messaggio, quindi termina (come sembra essere il caso nell'esempio HTML5Rocks)? In tal caso, come si ottengono aggiornamenti continui? Il browser esegue semplicemente il polling della pagina PHP a intervalli regolari? In tal caso, come è un "evento inviato dal server"? In che modo è diverso dallo scrivere una funzione setInterval in JavaScript che utilizza AJAX per chiamare una pagina PHP a intervalli regolari?
Spiacenti, questa è probabilmente una domanda incredibilmente ingenua. Ma nessuno degli esempi che sono riuscito a trovare lo rende chiaro.
[AGGIORNARE]
Penso che la mia domanda fosse formulata male, quindi ecco alcuni chiarimenti.
Diciamo che ho una pagina web che dovrebbe visualizzare il prezzo più recente delle azioni Apple.
Quando l'utente apre la pagina per la prima volta, la pagina crea un EventSource con l'URL del mio "flusso".
var source = new EventSource('stream.php');
La mia domanda è questa: come dovrebbe funzionare "stream.php"?
Come questo? (pseudo-codice):
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($msg) {
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
flush();
}
while (some condition) {
// check whether Apple's stock price has changed
// e.g., by querying a database, or calling a web service
// if it HAS changed, sendMsg with new price to client
// otherwise, do nothing (until next loop)
sleep (n) // wait n seconds until checking again
}
?>
In altre parole, "stream.php" rimane aperto finché il client è "connesso" ad esso?
Se è così, significa che hai tanti thread in esecuzione stream.php
quanti sono gli utenti simultanei? In tal caso, è fattibile in remoto o è un modo appropriato per creare un'applicazione? E come fai a sapere quando puoi terminare un'istanza di stream.php
?
La mia ingenua impressione è che, in questo caso, PHP non sia una tecnologia adatta per questo tipo di server. Ma tutte le demo che ho visto finora implicano che PHP va bene per questo, motivo per cui sono così confuso ...