Tous,
HTML5 Rocks propose un bon 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 type Facebook ou une vignette boursière, dans lequel le serveur "pousserait" un nouveau message vers le client chaque fois qu'un élément de données change, comment cela fonctionne-t-il ?
En d'autres termes... Est-ce que le script de PHP a une boucle qui tourne continuellement, vérifiant un changement dans les données, puis envoyant un message chaque fois qu'il en trouve un ? Si c'est le cas - comment savoir quand mettre fin à ce processus ?
Ou bien, le script PHP script envoie-t-il simplement le message, puis se termine (comme cela semble être le cas dans l'exemple de HTML5Rocks) ? Si c'est le cas, comment obtenez-vous des mises à jour continues ? Le navigateur interroge-t-il simplement la page PHP à intervalles réguliers ? Si oui, en quoi est-ce un "événement envoyé par le serveur" ? En quoi est-ce différent de l'écriture d'une fonction setInterval en JavaScript qui utilise AJAX pour appeler une page PHP à intervalles réguliers ?
Désolé - c'est probablement une question incroyablement naïve. Mais aucun des exemples que j'ai pu trouver n'est clair à ce sujet.
[MISE À JOUR]
Je pense que ma question était mal formulée, alors voici quelques éclaircissements.
Disons que j'ai une page Web qui doit afficher le cours le plus récent de l'action Apple.
Lorsque l'utilisateur ouvre la page pour la première fois, celle-ci crée un EventSource avec l'URL de mon "stream".
var source = new EventSource('stream.php');
Ma question est la suivante : comment doit fonctionner "stream.php" ?
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, le fichier "stream.php" reste-t-il ouvert tant que le client y est "connecté" ?
Si oui, cela signifie-t-il que vous avez autant de fils en cours d'exécution stream.php
comme vous avez des utilisateurs simultanés ? Si oui, est-ce faisable à distance, ou est-ce une façon appropriée de construire une application ? Et comment savez-vous quand vous pouvez FIN une instance de stream.php
?
Mon impression naïve est que, si c'est le cas, PHP n'est pas une technologie appropriée pour ce type de serveur. Mais toutes les démonstrations que j'ai vues jusqu'à présent laissent entendre que PHP convient parfaitement à ce type de serveur, d'où ma confusion...