Ce que j'ai appris en tant que développeur PHP synchrone sur le PHP asynchrone
J'ai travaillé avec Laravel pendant des années. J'utilisais le PHP synchrone. Une requête arrive, un processus s'exécute, et une réponse est envoyée. Je n'ai jamais eu besoin de l'asynchrone.
Puis, j'ai lu des choses sur la nouvelle API de Polling de PHP 8.6. Cela a changé ma vision de la manière dont PHP gère les tâches.
Voici une analyse du fonctionnement de l'asynchrone.
Le problème des E/S bloquantes
Lorsque vous appelez une API, votre code attend.
Exemple : $response = Http::get('https://api.example.com');
Si cette API prend 300 ms, votre processus PHP ne fait rien pendant 300 ms. Il reste dans un état de veille. Il occupe de la mémoire et un slot de worker. Si tous vos workers sont en veille, votre serveur cesse d'accepter de nouvelles requêtes.
La solution asynchrone
L'asynchrone vous permet d'effectuer d'autres tâches pendant ces 300 ms. Au lieu d'attendre, vous exécutez d'autres tâches.
Mais comment savoir quand les données arrivent ? C'est là que le noyau (kernel) intervient.
L'évolution du Polling
select() PHP dispose de
stream_select()depuis PHP 4. Il demande au noyau : « Des données sont-elles prêtes sur ces sockets ? ». Le problème est la « taxe de rescan ». Si vous avez 10 000 connexions, vous devez envoyer la liste entière au noyau à chaque fois. C'est lent et cela atteint des limites.epoll / kqueue Il s'agit d'une fonctionnalité du noyau, pas du langage. Linux utilise epoll. macOS utilise kqueue. Au lieu de scanner une liste complète, le noyau maintient une liste de sockets prêts (ready-list). Il vous indique uniquement quels sockets spécifiques contiennent des données. Cela permet de passer à l'échelle avec des milliers de connexions sans coût supplémentaire.
Fibers (PHP 8.1) Les Fibers vous permettent de mettre en pause une fonction n'importe où dans la pile d'appels (call stack). Une Fiber ne se réveille pas toute seule. C'est comme une vidéo YouTube en pause. Quelqu'un doit appeler
$fiber->resume()pour la relancer.
Le chaînon manquant : PHP 8.6
Les E/S asynchrones nécessitent trois éléments : • Pause : Fibers (désormais dans le cœur de PHP) • Décision : L'Event Loop (code PHP pur) • Connaissance : Kernel Polling (le chaînon manquant)
Jusqu'à présent, PHP manquait d'un moyen natif de « savoir » quel socket est prêt sans utiliser d'anciens outils ou des extensions en C.
PHP 8.6 comble cette lacune. Il apporte une API de Polling native au cœur du langage. Il utilisera automatiquement epoll sur Linux et kqueue sur Mac.
Vue d'ensemble
L'asynchrone n'est pas magique. Une boucle d'événements (event loop) n'est que du code PHP qui décide quand appeler resume() sur une Fiber.
Les Fibers offrent la capacité de mettre en pause. epoll apporte l'intelligence nécessaire pour savoir quand reprendre.
Si vous utilisez uniquement le PHP synchrone, vous n'avez pas besoin de modifier vos applications Laravel aujourd'hui. Mais comprendre ce modèle rend les bibliothèques asynchrones comme ReactPHP ou Amp beaucoup plus faciles à maîtriser.
Construisez, ne vous contentez pas de consommer. Exécutez le code vous-même pour voir comment il fonctionne.
