Todas,
HTML5 Rocks tiene un buen tutorial para principiantes sobre eventos enviados por el servidor (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Pero no entiendo un concepto importante: ¿qué desencadena el evento en el servidor que hace que se envíe un mensaje?
En otras palabras, en el ejemplo de HTML5, el servidor simplemente envía una marca de tiempo una vez :
<?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()));
Si estuviera construyendo un ejemplo práctico, por ejemplo, un "muro" al estilo de Facebook o un indicador de cotización, en el que el servidor "enviaría" un nuevo mensaje al cliente cada vez que cambia algún dato, ¿cómo funciona?
En otras palabras ... ¿El script PHP tiene un bucle que se ejecuta continuamente, verificando un cambio en los datos y luego envía un mensaje cada vez que encuentra uno? Si es así, ¿cómo sabe cuándo finalizar ese proceso?
O bien, ¿el script PHP simplemente envía el mensaje y luego finaliza (como parece ser el caso en el ejemplo de HTML5Rocks)? Si es así, ¿cómo obtiene actualizaciones continuas? ¿El navegador simplemente consulta la página PHP a intervalos regulares? Si es así, ¿cómo es eso un "evento enviado por el servidor"? ¿En qué se diferencia esto de escribir una función setInterval en JavaScript que usa AJAX para llamar a una página PHP a intervalos regulares?
Lo siento, esta es probablemente una pregunta increíblemente ingenua. Pero ninguno de los ejemplos que he podido encontrar aclara esto.
[ACTUALIZAR]
Creo que mi pregunta estaba mal redactada, así que aquí tienes algunas aclaraciones.
Digamos que tengo una página web que debería mostrar el precio más reciente de las acciones de Apple.
Cuando el usuario abre la página por primera vez, la página crea un EventSource con la URL de mi "flujo".
var source = new EventSource('stream.php');
Mi pregunta es la siguiente: ¿cómo debería funcionar "stream.php"?
¿Me gusta esto? (pseudocódigo):
<?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
}
?>
En otras palabras, ¿"stream.php" permanece abierto mientras el cliente esté "conectado" a él?
Si es así, ¿eso significa que tiene tantos subprocesos en ejecución stream.php
como usuarios simultáneos? Si es así, ¿es eso remotamente factible o una forma adecuada de crear una aplicación? ¿Y cómo sabe cuándo puede FINALIZAR una instancia de stream.php
?
Mi impresión ingenua es que, si este es el caso, PHP no es una tecnología adecuada para este tipo de servidor. Pero todas las demostraciones que he visto hasta ahora implican que PHP está bien para esto, por eso estoy tan confundido ...