WebSocket en PHP : applications temps réel de A à Z

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

Qu'est-ce que WebSocket et pourquoi en a-t-on besoin en PHP



Le protocole HTTP traditionnel fonctionne selon le schéma « requête-réponse » : le client envoie une requête, le serveur la traite et renvoie une réponse. Pour obtenir de nouvelles données, le client doit constamment recharger la page ou utiliser l'AJAX-polling (requêtes périodiques au serveur). Cette approche crée une charge excessive et n'assure pas une véritable communication « en direct ».



WebSocket (RFC 6455) est un protocole qui établit une connexion bidirectionnelle permanente entre le client (navigateur) et le serveur. Après la poignée de main (handshake), les données peuvent être transmises dans les deux sens en temps réel sans requêtes HTTP répétées. C'est la solution idéale pour :



  • Les chats et messageries instantanées
  • Les fils d'actualités et notifications
  • L'édition collaborative de documents
  • Les jeux et enchères
  • La surveillance et les tableaux de bord


Beaucoup pensent que PHP n'est pas adapté aux tâches temps réel en raison de sa nature synchrone. Cependant, avec l'apparition de bibliothèques comme Ratchet et ReactPHP, la situation a radicalement changé. PHP peut fonctionner efficacement avec WebSocket en utilisant une architecture orientée événements et des entrées-sorties non bloquantes.



Architecture d'une application WebSocket en PHP



Avant d'écrire du code, il est important de comprendre comment fonctionne une connexion WebSocket côté serveur PHP.



Étapes d'établissement de la connexion



  1. Poignée de main HTTP (handshake) : Le client envoie une requête HTTP spéciale avec l'en-tête Upgrade: websocket. Le serveur vérifie la clé Sec-WebSocket-Key et renvoie une réponse avec le statut 101 Switching Protocols.
  2. Changement de protocole : Après une poignée de main réussie, la connexion passe en mode WebSocket. Les échanges de données ultérieurs se font via des trames binaires.
  3. Communication duplex : Le serveur et le client peuvent envoyer des messages à tout moment, jusqu'à ce que la connexion soit fermée par l'une des parties.


PHP synchrone vs PHP asynchrone



Un script PHP classique fonctionne de manière synchrone : une requête = un processus, après la réponse, le script se termine. WebSocket nécessite un processus constamment actif qui écoute un port et gère de nombreuses connexions simultanées. C'est là que ReactPHP vient à la rescousse — une bibliothèque qui implémente une boucle d'événements (event loop) pour PHP.



La bibliothèque Ratchet est construite au-dessus de ReactPHP et fournit une interface pratique pour créer des serveurs WebSocket. Elle prend en charge le travail de bas niveau avec les sockets, l'analyse des trames et la gestion des connexions.



Implémentation pratique : création d'un chat temps réel



Examinons la création d'un chat simple avec WebSocket en utilisant Ratchet. Cet exemple peut être adapté à toutes les tâches temps réel.



Étape 1 : Installation des dépendances



Assurez-vous d'avoir Composer installé (gestionnaire de dépendances pour PHP). Installez Ratchet et ses dépendances :



composer require cboden/ratchet


Étape 2 : Création de la classe de gestionnaire



Créons un fichier ChatServer.php qui gérera les connexions et les messages :



<?phpnamespace MyApp;

use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;

class ChatServer implements MessageComponentInterface{ protected $clients;

public function __construct() { // SplObjectStorage — un moyen pratique de stocker les objets de connexion $this->clients = new \\SplObjectStorage; echo "Serveur démarré !"; }

public function onOpen(ConnectionInterface $conn) { // Un nouveau client s'est connecté $this->clients->attach($conn); echo "Nouvelle connexion : {$conn->resourceId}"; }

public function onMessage(Connectio

Blogs

Book Recommendations