Quand votre code PHP cesse d'être un simple script
\n\nAvez-vous déjà lancé un script PHP traitant un millier d'e-mails et attendu une minute entière ? Ou tenté de créer un chat en PHP pur sans rechargement constant de la page ? Si oui, vous avez rencontré les limites de l'approche synchrone traditionnelle.
\n\nL'architecture événementielle en PHP n'est pas qu'un terme à la mode venu de Node.js. C'est une véritable méthode pour rendre votre code plus rapide, plus réactif et plus scalable. Dans cet article, nous allons voir comment fonctionne la programmation événementielle en PHP, écrire plusieurs exemples concrets et comprendre quand l'utiliser.
\n\nQu'est-ce que l'architecture événementielle en termes simples
\n\nImaginez un bureau où chaque employé suit scrupuleusement une procédure : « Fais A, puis B, puis C ». C'est le code synchrone. Imaginez maintenant un bureau où les employés réagissent aux événements : « Quand un e-mail arrive, réponds-y », « Quand une commande est validée, envoie une notification ». Voilà l'architecture événementielle.
\n\nDans une architecture événementielle en PHP, le programme ne s'exécute pas linéairement. Il attend des événements (clic, requête, minuteur, fin de tâche) et y réagit. Le composant principal est la boucle d'événements (event loop), qui vérifie en permanence si quelque chose s'est produit et déclenche les gestionnaires appropriés.
\n\nPourquoi les développeurs PHP devraient s'y intéresser
\n\nLongtemps, PHP a été associé exclusivement à l'exécution synchrone : une requête arrive, le script s'exécute, une réponse est renvoyée. Mais avec l'arrivée de bibliothèques comme ReactPHP et Amp, tout a changé. Vous pouvez désormais :
\n\n- \n
- Gérer des milliers de connexions WebSocket simultanément \n
- Exécuter des tâches en arrière-plan sans files d'attente comme RabbitMQ \n
- Construire de véritables microservices en PHP pur \n
- Écrire des clients et serveurs HTTP asynchrones \n
Et tout cela, sans changer de langage ni réécrire toute votre base de code.
\n\nLes composants clés de l'architecture événementielle
\n\nAvant d'écrire du code, comprenons les concepts essentiels. Dans tout système événementiel en PHP, on retrouve trois éléments principaux :
\n\n- \n
- Event loop — une boucle infinie qui écoute les événements (minuteurs, sockets, signaux) et les distribue aux gestionnaires. \n
- Emitter/Dispatcher — l'objet qui génère et envoie les événements. \n
- Listener/Handler — la fonction ou méthode qui réagit à un événement spécifique. \n
En PHP classique, vous écririez : file_get_contents('https://api.example.com') — et attendriez la réponse. Dans une approche événementielle, vous vous abonnez à l'événement « données reçues » et continuez à exécuter d'autres tâches.
Exemple 1 : Un Event Dispatcher simple en PHP pur
\n\nImplémentons un répartiteur d'événements basique sans bibliothèques externes. Cela vous aidera à comprendre l'essence de la programmation événementielle en PHP.
\n\n<?php\n\nclass EventDispatcher {\n private array $listeners = [];\n\n public function addListener(string $eventName, callable $listener): void {\n $this->listeners[$eventName][] = $listener;\n }\n\n public function dispatch(string $eventName, mixed $data = null): void {\n if (!isset($this->listeners[$eventName])) {\n return;\n }\n foreach ($this->listeners[$eventName] as $listener) {\n call_user_func($listener, $data);\n }\n }\n}\n\n// Utilisation\n$dispatcher = new EventDispatcher();\n\n$dispatcher->addListener('user.registered', function ($userData) {\n echo "Envoi de l'e-mail de bienvenue à {$userData['email']}\\n";\n});\n\n$dispatcher->addListener('user.registered', function ($userData) {\n echo "Journalisation de l'inscription de l'utilisateur {$userDa