Server-Sent Events en PHP : temps réel sans WebSocket et sans prise de tête

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Server-Sent Events en PHP : du temps réel qui ne mord pas

\n\n

Avez-vous déjà remarqué que votre messagerie préférée ou votre plateforme de cryptomonnaies met à jour les données instantanément, alors que votre site en PHP oblige encore l'utilisateur à appuyer sur F5 ? On dirait que le temps réel est réservé à une élite armée de Node.js ou de coûteux serveurs WebSocket. Mais si je vous disais que les Server-Sent Events (SSE) en PHP sont un moyen simple, élégant et incroyablement efficace d'ajouter des mises à jour en direct à votre projet ?

\n\n

Bienvenue sur PythonLib, où nous brisons les stéréotypes. Aujourd'hui, nous allons décortiquer les Server-Sent Events PHP — une technologie qui permet au serveur de « pousser » des données vers le client via HTTP classique, sans une seule ligne de magie JavaScript (enfin, presque). Pas de protocoles complexes, pas de problèmes avec NAT et proxy — seulement du PHP pur et simple et un flux de données qui coule comme une rivière de montagne.

\n\n

Que sont les Server-Sent Events et pourquoi sont-ils une « balle d'argent » pour PHP ?

\n\n

Les SSE sont une spécification HTML5 qui permet au serveur d'envoyer un nombre arbitraire d'événements au client via une seule connexion HTTP persistante. Contrairement à WebSocket, qui est bidirectionnel, les SSE fonctionnent uniquement « du serveur vers le client ». Et c'est parfait ! Pour 90 % des cas (notifications, fils d'actualité, monitoring, tickers boursiers), la communication inverse n'est pas nécessaire. Pourquoi sortir l'artillerie lourde quand on peut se contenter d'une arme légère ?

\n\n

Les principaux avantages des notifications temps réel PHP via SSE :

\n
    \n
  • Simplicité d'implémentation — côté serveur, c'est un script PHP classique qui ne ferme pas la connexion.
  • \n
  • Reconnexion automatique — le navigateur se reconnecte tout seul si la connexion est interrompue.
  • \n
  • Fonctionne via n'importe quel proxy — HTTP/1.1, HTTP/2, Nginx, Apache — tout fonctionne nativement.
  • \n
  • Faible consommation de ressources — contrairement au polling, les requêtes ne sont pas dupliquées toutes les 2 secondes.
  • \n
\n\n

Bien sûr, les SSE ont des limites : le nombre maximum de connexions simultanées dans un navigateur (6 par domaine), et elles ne sont pas supportées dans les anciens Internet Explorer. Mais pour les applications modernes, ce n'est pas un problème. Et si vous avez besoin de plus, utilisez HTTP/2, où ces limitations sont levées.

\n\n

Comment fonctionnent les Server-Sent Events en PHP : de la théorie à la pratique

\n\n

Imaginons que votre script PHP soit un barman. Une requête normale, c'est quand le client s'approche, commande une boisson (fait une requête GET), le barman sert (exécute le code), donne le verre (envoie la réponse) et ferme le bar. Avec SSE, le client s'approche, commande « s'il vous plaît, servez-moi un nouveau cocktail toutes les 5 secondes », et le barman commence à verser un flux infini sans fermer le robinet.

\n\n

Techniquement, cela ressemble à ceci :

\n
    \n
  1. Le client (navigateur) crée un objet EventSource et envoie une requête GET vers le script PHP.
  2. \n
  3. Le serveur définit l'en-tête Content-Type: text/event-stream et désactive la mise en cache.
  4. \n
  5. Le serveur entre dans une boucle infinie, envoyant des données au format data: {"message": "hello"}\\n\\n.
  6. \n
  7. Lorsque le serveur doit s'arrêter (ou que le client ferme l'onglet), la connexion est interrompue.
  8. \n
\n\n

Premier exemple : un simple « hello world » en SSE avec PHP

\n\n

Créons un fichier sse.php. Ce sera notre « mouvement perpétuel » :

\n\n
<?php\n// sse.php - serveur Server-Sent Events très simple\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // pour Nginx\n\n// Assurons-nous que PHP n'interrompt pas l'exécution\nset_time_limit(0);\n\n$counter = 0;\n\nwhile (true) {\n    $counter++;\n    $data = ['time' => date('H:i:s'), 'count' => $counter];\n    \n    // Envoi de l'événement\n    echo "id: {$counter}\\n";\n    echo "event: update\\n";\n    echo "data: " . json_encode($data) . "\\n\\n";\n    \n    //                

Blogs

Book Recommendations