WebSockets en PHP : Créer des applications temps réel sans magie

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

WebSockets en PHP : comment faire parler votre site en temps réel

\n\n

Imaginez un site web classique. Vous cliquez sur un bouton — et vous attendez que la page se rafraîchisse. C'est comme envoyer une lettre par la poste : vous la jetez dans la boîte et espérez qu'elle arrive. Imaginez maintenant que vous parlez au téléphone — vous entendez immédiatement votre interlocuteur. WebSockets — c'est exactement ce « téléphone » pour le web. Et oui, ça fonctionne en PHP.

\n\n

Beaucoup pensent que WebSocket est l'apanage de Node.js ou Python. Mais PHP, bien qu'il ait été créé pour « coller » du HTML, a depuis longtemps dépassé son berceau. Aujourd'hui, nous allons voir comment créer une application temps réel en PHP — que ce soit un chat, un fil d'actualités ou une analytics en direct. Et sans bricolage.

\n\n

Si vous avez déjà essayé de faire un chat en direct en PHP via du long polling et vu le serveur s'effondrer sous 1000 requêtes par seconde — cet article est pour vous. Les WebSockets changent la donne.

\n\n

Qu'est-ce qu'un WebSocket et pourquoi PHP s'entend-il avec lui ?

\n\n

Un WebSocket est un canal de communication bidirectionnel entre le navigateur et le serveur. Contrairement à HTTP, où le client initie toujours la requête, ici le serveur peut lui-même envoyer des données au client. Cela permet un véritable temps réel, et non une imitation.

\n\n

La différence clé avec le long polling (où le client demande constamment « alors, des nouvelles ? ») — dans WebSocket, la connexion reste ouverte. Une fois établie, vous communiquez sans interruption. L'économie de trafic et de ressources est colossale.

\n\n

PHP, en tant que langage, exécute les scripts de manière séquentielle. Mais cela ne l'empêche pas d'être un excellent serveur pour WebSocket. Le secret réside dans l'architecture : nous n'exécutons pas PHP via un serveur web (Apache/Nginx) pour chaque connexion, mais nous l'utilisons comme un démon autonome. Et c'est là que les bibliothèques entrent en jeu.

\n\n

Bibliothèques pour WebSocket en PHP : que choisir ?

\n\n

Il y a deux bibliothèques les plus populaires — et les deux méritent votre attention :

\n\n
    \n
  • Ratchet — le grand-père des WebSocket PHP. Fiable, éprouvé, mais un peu « à l'ancienne ». Utilise un modèle événementiel basé sur ReactPHP. Idéal pour les chats simples et les notifications.
  • \n
  • Swoole — une bête. Ce n'est pas juste une bibliothèque, mais un véritable moteur qui réécrit le noyau de PHP. Il offre asynchronisme, coroutines et des performances proches de Go. Mais nécessite l'installation d'une extension sur le serveur.
  • \n
\n\n

Pour une première découverte, je recommande Ratchet — il est plus facile à prendre en main et ne nécessite pas de modifier le php.ini. De plus, il fonctionne parfaitement en combinaison avec ReactPHP, que nous aborderons également aujourd'hui.

\n\n

Écrire un serveur WebSocket simple en PHP avec Ratchet

\n\n

Créons un serveur d'écho basique. Il recevra les messages du client et les renverra. C'est le classique « Hello, World » pour WebSocket.

\n\n

Commencez par installer Ratchet via Composer. Ouvrez un terminal à la racine du projet :

\n\n
composer require cboden/ratchet
\n\n

Créez maintenant un fichier server.php :

\n\n
<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nclass EchoServer implements MessageComponentInterface {\n    public function onOpen(ConnectionInterface $conn) {\n        echo "Nouvelle connexion : {$conn->resourceId}\\n";\n    }\n\n    public function onMessage(ConnectionInterface $from, $msg) {\n        echo "Reçu : {$msg}\\n";\n        $from->send("Écho : {$msg}");\n    }\n\n    public function onClose(ConnectionInterface $conn) {\n        echo "Connexion {$conn->resourceId} fermée\\n";\n    }\n\n    public function onError(ConnectionInterface $conn, \\Exception $e) {\n        echo "Erreur : {$e->getMessage()}\\n";\n        $conn->close();\n    }\n}\n\n// Lancement du serveur\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\n\                

Blogs

Book Recommendations