logo oujood
🔍

Server-Sent Events HTML5

Les Server-Sent Events (SSE) permettent au serveur d'envoyer des données en continu vers le navigateur via une connexion HTTP persistante. Plus simples que les WebSockets quand la communication est à sens unique : du serveur vers le client.

OUJOOD.COM

Quand vous avez besoin que le serveur pousse des mises à jour vers le navigateur — un fil d'actualités, un tableau de bord de métriques, des notifications — vous n'avez pas forcément besoin de la complexité des WebSockets. Les Server-Sent Events font exactement ça, avec une seule ligne de JavaScript côté client et un endpoint HTTP classique côté serveur.

Leur atout principal : la reconnexion automatique. Si la connexion se coupe, le navigateur se reconnecte tout seul, sans que vous ayez à écrire la moindre logique de retry. C'est une fonctionnalité intégrée au protocole.

Ouvrir une connexion SSE avec EventSource

Côté navigateur, l'API s'appelle EventSource. On lui passe l'URL du endpoint serveur qui diffuse le flux :

Exemple :   📋 Copier le code

// Ouvrir une connexion SSE vers le serveur
const source = new EventSource('/api/flux');

// Recevoir les messages du serveur
source.onmessage = (event) => {
  console.log('Données reçues :', event.data);
};

// Connexion établie
source.onopen = () => {
  console.log('Connexion SSE ouverte.');
};

// Erreur ou déconnexion
source.onerror = (erreur) => {
  console.error('Erreur SSE :', erreur);
  // Le navigateur tente de se reconnecter automatiquement
};

Format du flux côté serveur

Le serveur doit retourner un flux avec le type MIME text/event-stream. Chaque message suit un format texte simple avec des champs préfixés :

Exemple :   📋 Copier le code

// Format d'un message SSE côté serveur (texte brut)

// Message simple
data: Bonjour depuis le serveur

// Message avec un id (permet la reprise après déconnexion)
id: 42
data: Message avec identifiant

// Message sur plusieurs lignes
data: première ligne
data: deuxième ligne

// Événement nommé (autre que "message")
event: notification
data: Vous avez un nouveau message

// Délai de reconnexion en millisecondes
retry: 3000

// Chaque message est séparé par une ligne vide

Exemple côté serveur en PHP

Voici comment diffuser un flux SSE depuis un script PHP — le cas le plus courant sur les hébergements mutualisés :

Exemple :   📋 Copier le code

// flux.php — endpoint SSE côté serveur
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');

$compteur = 0;

while (true) {
    $compteur++;
    $donnees = json_encode([
        'heure' => date('H:i:s'),
        'valeur' => rand(1, 100)
    ]);

    echo "id: {$compteur}\n";
    echo "data: {$donnees}\n\n";

    ob_flush();
    flush();

    sleep(2); // envoyer une mise à jour toutes les 2 secondes

    // Arrêter si le client s'est déconnecté
    if (connection_aborted()) break;
}

Recevoir des événements nommés

Le serveur peut envoyer différents types d'événements avec le champ event:. Côté client, on écoute chaque type séparément avec addEventListener :

Exemple :   📋 Copier le code

const source = new EventSource('/api/flux');

// Écouter les événements génériques "message"
source.addEventListener('message', (event) => {
  console.log('Message :', event.data);
});

// Écouter un type d'événement spécifique "notification"
source.addEventListener('notification', (event) => {
  const data = JSON.parse(event.data);
  afficherNotification(data.texte);
});

// Écouter les mises à jour de métriques
source.addEventListener('metrique', (event) => {
  const data = JSON.parse(event.data);
  mettreAJourGraphique(data.valeur);
});

Exemple pratique : tableau de bord temps réel

Voici une implémentation complète d'un tableau de bord qui affiche des métriques serveur mises à jour en continu :

Exemple :   📋 Copier le code

const source = new EventSource('/api/metriques');
const cpu = document.getElementById('cpu');
const memoire = document.getElementById('memoire');
const statut = document.getElementById('statut');

source.onopen = () => {
  statut.textContent = 'Connecté — données en direct';
};

source.onmessage = (event) => {
  const data = JSON.parse(event.data);
  cpu.textContent = `CPU : ${data.cpu}%`;
  memoire.textContent = `Mémoire : ${data.memoire} Mo`;
};

source.onerror = () => {
  statut.textContent = 'Reconnexion en cours...';
  // Le navigateur gère la reconnexion — pas besoin de code supplémentaire
};

// Fermer le flux quand l'utilisateur quitte la page
window.addEventListener('beforeunload', () => {
  source.close();
});

Reprendre un flux après déconnexion avec Last-Event-ID

Quand le serveur numérote ses événements avec id:, le navigateur envoie automatiquement le dernier id reçu dans le header Last-Event-ID lors de la reconnexion. Le serveur peut ainsi reprendre le flux là où il s'est arrêté :

Exemple :   📋 Copier le code

// Côté serveur PHP — reprendre depuis le dernier id connu
$dernierIdRecu = isset($_SERVER['HTTP_LAST_EVENT_ID'])
    ? (int) $_SERVER['HTTP_LAST_EVENT_ID']
    : 0;

// Envoyer uniquement les événements manqués
$evenementsManques = recupererDepuis($dernierIdRecu);

foreach ($evenementsManques as $evt) {
    echo "id: {$evt['id']}\n";
    echo "data: {$evt['donnees']}\n\n";
    ob_flush();
    flush();
}

Fermer une connexion SSE

Côté navigateur, close() met fin au flux et empêche toute reconnexion automatique :

Exemple :   📋 Copier le code

// Fermer la connexion SSE manuellement
source.close();
console.log('Flux SSE fermé. État :', source.readyState);
// readyState vaut 2 (CLOSED) après close()

SSE vs WebSockets : le bon choix selon le besoin

Les deux technologies font du temps réel, mais elles ne répondent pas au même besoin :

  • Server-Sent Events : communication unidirectionnelle (serveur → navigateur), reconnexion automatique intégrée, fonctionne sur HTTP/1.1 et HTTP/2, plus simple à mettre en place.
  • WebSockets : communication bidirectionnelle (les deux côtés parlent), protocole dédié wss://, indispensable pour le chat, les jeux ou la collaboration en temps réel.

Pour un flux de notifications, un cours de bourse, ou des logs en direct, SSE est le choix le plus simple. Pour tout ce qui nécessite que le navigateur envoie aussi des données au serveur de façon continue, optez pour WebSockets.

Par carabde | Mis à jour le 17 avril 2026


chapitre précédent   sommaire   chapitre suivant