Programmation asynchrone en PHP : guide complet

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

Introduction à la programmation asynchrone en PHP

Traditionnellement, PHP est considéré comme un langage synchrone : chaque requête est exécutée séquentiellement, bloquant l'exécution jusqu'à la fin de l'opération (par exemple, une requête à une base de données ou une API). Cependant, avec l'augmentation des exigences de performance des applications web, la programmation asynchrone en PHP devient de plus en plus demandée. Le code asynchrone permet d'exécuter plusieurs tâches simultanément, sans attendre la fin de chacune, ce qui accélère considérablement le traitement des requêtes et réduit la charge sur le serveur.

Dans ce guide, nous allons aborder les concepts fondamentaux de la programmation asynchrone en PHP, examiner les bibliothèques populaires (ReactPHP, Amp), ainsi que les fonctionnalités modernes du langage — Fiber et les générateurs.



Fondamentaux de l'asynchrone : Event Loop et entrées-sorties non bloquantes

À la base de toute approche asynchrone se trouve l'Event Loop (boucle d'événements). Il s'agit d'une boucle infinie qui vérifie si un événement quelconque s'est produit (par exemple, la fin d'une requête HTTP ou la lecture d'un fichier). Si un événement se produit, le gestionnaire correspondant est exécuté. Pendant ce temps, le thread principal n'est pas bloqué — il peut basculer vers une autre tâche.

Les entrées-sorties non bloquantes (Non-blocking I/O) sont un principe clé. Dans le code synchrone, un appel à file_get_contents() bloque l'exécution du script jusqu'au chargement complet du fichier. En mode asynchrone, vous initiez l'opération et continuez à exécuter d'autre code, le résultat arrivant via un callback ou une Promise.



Exemple : requête synchrone vs asynchrone

// Code synchrone (bloquant)$start = microtime(true);$data1 = file_get_contents('http://example.com/api1');$data2 = file_get_contents('http://example.com/api2');echo "Temps d'exécution : " . (microtime(true) - $start) . " sec"; // ~2 sec (si chaque requête prend 1 sec)

// Code asynchrone (ReactPHP)$loop = React\\EventLoop\\Factory::create();$client = new React\\Http\\Browser($loop);

$promise1 = $client->get('http://example.com/api1');$promise2 = $client->get('http://example.com/api2');

$promise1->then(function ($response) { echo "Réponse 1 reçue";});$promise2->then(function ($response) { echo "Réponse 2 reçue";});

$loop->run();// Temps d'exécution ~1 sec (les requêtes sont exécutées en parallèle)


Bibliothèques pour la programmation asynchrone en PHP

Aujourd'hui, les deux bibliothèques les plus populaires sont ReactPHP et Amp. Toutes deux fournissent une Event Loop, des Promise, ainsi que des composants prêts à l'emploi pour travailler avec HTTP, les sockets et le système de fichiers.



ReactPHP

ReactPHP est une bibliothèque mature qui existe depuis 2012. Elle offre un accès de bas niveau à la boucle d'événements et de nombreux composants : react/socket, react/http, react/dns et autres.

// Exemple de serveur HTTP avec ReactPHP$loop = React\\EventLoop\\Factory::create();$server = new React\\Http\\Server($loop, function (Psr\\Http\\Message\\ServerRequestInterface $request) {    return new React\\Http\\Message\\Response(        200,        ['Content-Type' => 'text/plain'],        "Hello, Async World!"    );});$socket = new React\\Socket\\Server('127.0.0.1:8080', $loop);$server->listen($socket);echo "Serveur démarré sur http://127.0.0.1:8080";$loop->run();


Amp

Amp utilise des coroutines (coroutines basées sur les générateurs) et fournit une API de plus haut niveau. Au lieu de chaînes de then(), vous utilisez yield et await, ce qui rend le code similaire au code synchrone.

// Exemple avec Amp\\Amp\\Loop::run(function () {    $response = yield \\Amp\\Http\\Client\\HttpClient::request('http://example.com');    $body = yield $response->getBody()->buffer();    echo $body;});


Fiber : l'asynchrone au cœur de PHP 8.1

Depuis PHP 8.1, le langage a intégré les

Blogs

Book Recommendations