Eventos enviados pelo servidor e php - o que dispara eventos no servidor?
Todos,
O HTML5 Rocks tem um bom tutorial para iniciantes em Eventos enviados pelo servidor (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Mas, eu 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 timestampuma 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, um "muro" no estilo do Facebook ou um marcador de ações, no qual o servidor "enviaria" uma nova mensagem ao cliente sempre que algum dado fosse alterado, como isso funciona?
Em outras palavras...O script PHP tem um loop que é executado continuamente, verificando uma alteração nos dados e enviando uma mensagem sempre que encontrar um? Se sim, como você sabe quando encerrar esse processo?
Ou - o script PHP simplesmente envia a mensagem e termina (como parece ser o caso no exemplo HTML5Rocks)? Se sim, como você recebe atualizações contínuas? O navegador simplesmente pesquisa a página do PHP em intervalos regulares? Em caso afirmativo - como é que 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 questão incrivelmente ingênua. Mas nenhum dos exemplos que consegui encontrar deixa isso claro.
[ATUALIZAR]
Eu acho que minha pergunta foi mal formulada, então aqui está um pouco de esclarecimento.
Digamos que eu tenha uma página da Web que exiba o preço mais recente das ações da Apple.
Quando o usuário abre a página pela primeira vez, a página cria um EventSource com o URL do meu "stream".
var source = new EventSource('stream.php');
Minha pergunta é esta - 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 - o "stream.php" permanece aberto enquanto o cliente estiver "conectado" a ele?
Em caso afirmativo - isso significa que você tem tantos segmentos executandostream.php
como você tem usuários simultâneos? Em caso afirmativo - isso é remotamente viável ou uma maneira apropriada de criar um aplicativo? E como você sabe quando podeFIM uma instância destream.php
?
Minha impressão ingênua é que, se esse for o caso, PHPnão é uma tecnologia adequada para este tipo de servidor. Mas todas as demos que vi até agora implicam que o PHP é bom para isso, e é por isso que estou tão confuso ...