Tudo,
HTML5 Rocks tem um bom tutorial para iniciantes sobre eventos enviados pelo servidor (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Mas, não entendo um conceito importante - o que dispara o evento no servidor que faz com que uma mensagem seja enviada?
Em outras palavras - no exemplo HTML5 - o servidor simplesmente envia um timestamp uma 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()));
Se eu estivesse construindo um exemplo prático - por exemplo, uma "parede" no estilo do Facebook ou uma bolsa de valores, em que o servidor "enviaria" uma nova mensagem ao cliente sempre que algum dado fosse alterado, como isso funcionaria?
Em outras palavras ... O script PHP tem um loop que é executado continuamente, verificando se há uma alteração nos dados e enviando uma mensagem sempre que encontra um? Em caso afirmativo, como saber quando terminar esse processo?
Ou - o script PHP simplesmente envia a mensagem e, em seguida, termina (como parece ser o caso no exemplo HTML5Rocks)? Se sim - como você consegue atualizações contínuas? O navegador está simplesmente pesquisando a página PHP em intervalos regulares? Se sim - como isso é um "evento enviado pelo servidor"? Como isso é diferente de escrever uma função setInterval em JavaScript que usa AJAX para chamar uma página PHP em um intervalo regular?
Desculpe - esta provavelmente é uma pergunta incrivelmente ingênua. Mas nenhum dos exemplos que consegui encontrar deixa isso claro.
[ATUALIZAR]
Acho que minha pergunta foi mal formulada, então aqui estão alguns esclarecimentos.
Digamos que eu tenha uma página da web que deve exibir o preço mais recente das ações da Apple.
Quando o usuário abre a página pela primeira vez, ela cria um EventSource com a URL do meu "fluxo".
var source = new EventSource('stream.php');
Minha pergunta é a seguinte - como deve funcionar "stream.php"?
Como isso? (pseudo-có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
}
?>
Em outras palavras - "stream.php" permanece aberto enquanto o cliente está "conectado" a ele?
Em caso afirmativo - isso significa que você tem tantos threads em execução stream.php
quanto usuários simultâneos? Em caso afirmativo - isso é remotamente viável ou uma maneira apropriada de construir um aplicativo? E como você sabe quando pode ENCERRAR uma instância de stream.php
?
Minha impressão ingênua é que, se for o caso, PHP não é uma tecnologia adequada para esse tipo de servidor. Mas todas as demos que vi até agora indicam que o PHP é adequado para isso, e é por isso que estou tão confuso ...