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
- 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-Keyet renvoie une réponse avec le statut 101 Switching Protocols. - 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.
- 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