Tout,
HTML5 Rocks a un joli tutoriel pour débutants sur les événements envoyés par le serveur (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Mais, je ne comprends pas un concept important - qu'est-ce qui déclenche l'événement sur le serveur qui provoque l'envoi d'un message?
En d'autres termes - dans l'exemple HTML5 - le serveur envoie simplement un horodatage une fois :
<?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 je construisais un exemple pratique - par exemple, un «mur» de style Facebook ou un stock-ticker, dans lequel le serveur «poussait» un nouveau message au client à chaque fois qu'une donnée change, comment cela fonctionne-t-il?
En d'autres termes ... Le script PHP a-t-il une boucle qui s'exécute en continu, vérifiant un changement dans les données, puis envoyant un message à chaque fois qu'il en trouve un? Dans l'affirmative, comment savoir quand mettre fin à ce processus?
Ou - le script PHP envoie-t-il simplement le message, puis se termine (comme cela semble être le cas dans l'exemple HTML5Rocks)? Si oui, comment obtenir des mises à jour continues? Le navigateur interroge-t-il simplement la page PHP à intervalles réguliers? Si oui - comment est-ce un "événement envoyé par le serveur"? En quoi est-ce différent d'écrire une fonction setInterval en JavaScript qui utilise AJAX pour appeler une page PHP à intervalle régulier?
Désolé - c'est probablement une question incroyablement naïve. Mais aucun des exemples que j'ai pu trouver ne le précise.
[METTRE À JOUR]
Je pense que ma question était mal formulée, alors voici quelques éclaircissements.
Disons que j'ai une page Web qui devrait afficher le prix le plus récent de l'action Apple.
Lorsque l'utilisateur ouvre la page pour la première fois, la page crée un EventSource avec l'URL de mon "flux".
var source = new EventSource('stream.php');
Ma question est la suivante: comment "stream.php" devrait-il fonctionner?
Comme ça? (pseudo-code):
<?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 d'autres termes, "stream.php" reste-t-il ouvert tant que le client y est "connecté"?
Si tel est le cas, cela signifie-t-il que vous avez autant de threads en cours stream.php
d' exécution que d'utilisateurs simultanés? Si tel est le cas, est-ce possible à distance ou est-ce une manière appropriée de créer une application? Et comment savoir quand vous pouvez METTRE FIN à une instance de stream.php
?
Mon impression naïve est que, si tel est le cas, PHP n'est pas une technologie adaptée à ce type de serveur. Mais toutes les démos que j'ai vues jusqu'à présent impliquent que PHP est très bien pour cela, c'est pourquoi je suis si confus ...