Server-Sent Events en PHP : quand le serveur frappe lui-même à la porte du navigateur
\n\nAvez-vous déjà réfléchi au fonctionnement des fils d'actualités sur Twitter, des taux de change en bourse ou des notifications dans une messagerie ? Exactement — les données arrivent toutes seules, sans rechargement de page et sans requêtes Ajax interminables. La plupart des développeurs pensent immédiatement aux WebSockets, mais il existe une autre méthode, bien plus simple et élégante — les Server-Sent Events (SSE).
\n\nDans cet article, nous allons voir comment implémenter les Server-Sent Events en PHP à partir de zéro. Vous apprendrez à envoyer des données du serveur en temps réel, sans alourdir l'infrastructure avec des bibliothèques complexes. Pas de Node.js, pas de files d'attente — seulement du PHP pur et du HTML5.
\n\nQue sont les Server-Sent Events et pourquoi en avez-vous besoin ?
\n\nLes SSE (Server-Sent Events) sont une norme HTML5 qui permet au serveur d'envoyer des données au client via une seule connexion HTTP. Contrairement aux WebSockets, qui fonctionnent dans les deux sens, les SSE sont un canal unidirectionnel : les données vont uniquement du serveur vers le client. Mais c'est là que réside son principal avantage : l'implémentation est si simple qu'elle ne nécessite ni bibliothèques supplémentaires ni serveurs spéciaux.
\n\nOù les server-sent events php sont-ils utilisés ?
\n- \n
- Fils d'actualités et notifications en temps réel \n
- Surveillance des serveurs et des journaux \n
- Taux de change, cotations boursières \n
- Indicateurs de progression pour les opérations longues (téléchargement de fichiers, traitement vidéo) \n
- Chatbots et systèmes d'alerte \n
Contrairement au polling classique (où le client interroge le serveur toutes les N secondes), le SSE PHP crée une connexion permanente qui ne nécessite pas de nouvelles poignées de main ni d'en-têtes. Cela économise la bande passante et les ressources CPU.
\n\nComment fonctionne SSE : protocole et en-têtes
\n\nLe SSE repose sur une réponse HTTP standard avec un type de contenu spécial. Le serveur envoie les données au format texte, en utilisant les mots-clés event, data, id et retry. Le client reçoit le flux et traite les événements au fur et à mesure.
Le protocole de base ressemble à ceci :
\nContent-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Bonjour le monde\n\ndata: {"message": "Ceci est du JSON"}\n\nChaque message commence par data:, suivi du texte. Si vous devez envoyer plusieurs lignes, écrivez simplement plusieurs data: à la suite. Une ligne vide \\n\\n signale la fin du message.
Écrire notre premier script SSE en PHP
\n\nCréons un script simple qui enverra l'heure actuelle toutes les 2 secondes. C'est un exemple classique qui montre immédiatement la magie du temps réel PHP.
\n\nFichier sse.php :
<?php\n// Désactiver la mise en mémoire tampon de sortie\nob_implicit_flush(true);\nob_end_flush();\n\n// Définir les en-têtes SSE\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // Pour Nginx\n\nwhile (true) {\n // Formater les données\n $data = [\n 'time' => date('H:i:s'),\n 'timestamp' => time()\n ];\n \n // Envoyer l'événement\n echo "data: " . json_encode($data) . "\\n\\n";\n \n // Vérifier si le client a fermé la connexion\n if (connection_aborted()) {\n break;\n }\n \n // Pause de 2 secondes\n sleep(2);\n}\n?>\n\nRemarquez : nous utilisons une boucle infinie while(true), mais nous vérifions systématiquement connection_aborted(). Si le client ferme l'onglet, le script se termine sans surcharger le serveur.
Écrivons maintenant la partie cliente en JavaScript :
\n<!DOCTYPE html>\n<html>\n<head>\n <title>Démo SSE PHP</title>\n</head>\n<body>\n <h2>Heure actuelle depuis le serveur :</h2