Unha das características engadidas a Opera dende a versión 9 son os Server-Sent Events (SSE), os cales forman parte da especificación WHATWG Web Applications 1.0. Facendo uso dos SSE podemos empuxar (push) eventos DOM dende o servidor ao navegador cliente dun xeito continuado.
Para empregar esta técnica temos que definir unha etiqueta html, event-source, que conterá o atributo src apuntando a unha URL do servidor que será a fonte dos eventos.
<strong>Message from Server:
<span id="panel"><!-- os envíos do servidor incluirémolos aquí --></span>
<event-source src="events.php" id="source" />
Dende javascript ligamos o evento server-message (ou o nome de evento que desexemos devolver dende o servidor), a clausura javascript que manexará a resposta. A clausura recibirá coma parámetro un evento como os tratados no DOM, no cal poderemos acceder a propiedade data que no noso caso conterá os datos transmitidos. Coa información do servidor o que facemos é chamar a función updateMessage que incluirá o contido no div con id "panel".
function updateMessages(msg) {
document.getElementById('panel').innerHTML = msg;
}
window.onload = function() {
var oSource = document.getElementById('source');
oSource.addEventListener('server-message', function(evt) {
updateMessages(evt.data);
}, false);
};
No lado servidor temos un bucle infinito que sondeará cada segundo se existe unha nova mensaxe gardada en memcached almacenada na clave "message". OLLO: a cabeceira HTTP establecida no comezo do ficheiro que lle indica ao navegador o tipo de comunicación coa que estamos a traballar.
header("Content-Type: application/x-dom-event-stream");
// Connect to memcached server
$memcache = new Memcache();
$memcache->connect('localhost', 11211) or die ("Could not connect");
$previous = null;
while(true) {
// Other application publish on $memcache->set('message', 'texto...');
$content = $memcache->get('message');
if($content !== $previous) {
echo "Event: server-message\n"; // event name is "server-message". You could change it
echo "data: $content\n\n";
ob_flush();
flush(); // clean output buffer
}
sleep(1); // wait a second
}
Outra cousa a ter en conta é o formato do envío ao navegador. Por unha parte envíase nunha liña o nome do evento Event: server-message e noutra liña van os datos seguidos do texto data: $content.
Agora só queda que dende o servidor se almacene algún valor en memcached coa clave "message". Isto podería ser feito por unha aplicación externa ou, como se pode ver nos pantallazos directamente dende o intérprete de PHP conectándose ao servidor de memcached. Pódese empregar o seguinte código como exemplo:
$value = rand();
$memcache = new Memcache();
$memcache->connect('localhost', 11211) or die ("Could not connect");
$memcache->set('message', $value);

Pantallazos do funcionamento de
Neste exemplo empregóuse memcached para ter a información dispoñible a nivel da aplicación dun modo rápido. Dependendo das funcionalidades que queiramos proporcionar poderemos empregar outras solucións: colas de mensaxes, base de datos, couchdb, apc, ... empuxando a información directamente ao cliente en canto a teñamos dispoñible.
Este tipo de comunicación cliente-servidor-cliente é máis eficiente e sinxela que empregar Ajax ou Comet, o problema radica no soporte proporcionado polos navegadores. Coa progresiva implantación de HTML5 nos navegadores disporemos destas técnicas e outras máis potentes como os WebSockets, localStorage, ...
Referencias:
| Última actualización | 2012-08-15 2:46 AM (Europe/Madrid) |
| Data de creación | 2010-01-04 11:00 PM (Europe/Madrid) |
| Server-sent DOM event en Opera | |
| php javascript html5 operabrowser | |