WebSockets en PHP : créer des applications temps réel sans magie
\n\nAvez-vous déjà réfléchi à la raison pour laquelle, dans les applications web modernes, les notifications arrivent instantanément et les chats fonctionnent sans avoir à appuyer constamment sur F5 ? Le secret réside dans les WebSockets. Et oui, PHP sait aussi faire du temps réel. Dans cet article, nous allons comprendre comment faire ami-ami PHP avec les WebSockets, écrire un chat en direct et des notifications, et surtout, le faire sans douleur ni bibliothèques superflues.
\n\nSi vous avez l'habitude que PHP soit "requête-réponse", préparez-vous à être surpris. Avec les WebSockets en PHP, vous pouvez créer des applications temps réel complètes : d'un simple chat à un jeu multijoueur. Et tout cela, dans votre langage préféré.
\n\nQue sont les WebSockets et pourquoi en PHP ?
\n\nWebSocket est un protocole de communication bidirectionnelle entre un client et un serveur. Contrairement au HTTP classique où le client sollicite constamment le serveur en demandant "alors, des nouvelles ?", WebSocket maintient la connexion ouverte. Le serveur envoie lui-même les données au client lorsqu'elles apparaissent.
\n\nPour PHP, c'est une véritable avancée. Avant, le temps réel était l'apanage de Node.js ou de Python avec asyncio. Mais aujourd'hui, les applications temps réel en PHP sont une réalité. Grâce à des bibliothèques comme Ratchet et Swoole, PHP peut fonctionner comme un processus de longue durée, traitant des milliers de connexions simultanées.
\n\nOù cela peut-il être utile ?
\n- \n
- Chats et messageries instantanées ; \n
- Systèmes de notifications (nouvelles commandes, messages) ; \n
- Édition collaborative de documents ; \n
- Jeux en ligne et quiz ; \n
- Tableaux de bord et monitoring en temps réel. \n
Préparation : ce qu'il faut pour commencer
\n\nPour travailler avec un serveur WebSocket en PHP, nous aurons besoin de :
\n- \n
- PHP 7.4 ou supérieur (de préférence 8.x) ; \n
- Composer — le gestionnaire de paquets ; \n
- La bibliothèque Ratchet (ou Swoole pour la production) ; \n
- Une compréhension de base de la POO et du travail en console. \n
Installons Ratchet via Composer :
\ncomposer require cboden/ratchet\n\nAprès l'installation, vous aurez un dossier vendor et un fichier composer.json. Tout est prêt pour écrire votre première application temps réel en PHP.
\n\nÉcrire un serveur WebSocket simple en PHP
\n\nCréons un fichier server.php. Ce sera notre serveur WebSocket PHP, qui accepte les connexions et diffuse les messages à tous les clients connectés.
<?php\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nclass Chat implements MessageComponentInterface {\n protected $clients;\n\n public function __construct() {\n $this->clients = new \\SplObjectStorage;\n echo "Serveur démarré !\\n";\n }\n\n public function onOpen(ConnectionInterface $conn) {\n $this->clients->attach($conn);\n echo "Nouvelle connexion : {$conn->resourceId}\\n";\n }\n\n public function onMessage(ConnectionInterface $from, $msg) {\n foreach ($this->clients as $client) {\n if ($from !== $client) {\n $client->send($msg);\n }\n }\n echo "Message de {$from->resourceId} : $msg\\n";\n }\n\n public function onClose(ConnectionInterface $conn) {\n $this->clients->detach($conn);\n echo "Connexion fermée : {$conn->resourceId}\\n";\n }\n\n public function onError(ConnectionInterface $conn, \\Exception $e) {\n echo "Erreur : {$e->getMessage()}\\n";\n $conn->close();\n }\n}\n\n$server = IoServer::factory(\n new HttpServer(\n new WsServer(\n new Chat()\n )\n ),\n 8080\n);\n\n$server->run();\n\nLançons le serveur depuis la console :
\nphp server.php\n\nVoilà ! Le serveur écoute sur le port 8080 et est prêt à accepter des connexions WebSocket. Maintenant