Concurrence en PHP : threads, goroutines et async/await expliqués avec exemples

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 : pourquoi un développeur PHP doit-il penser à la concurrence ?

\n\n

Il fut un temps où PHP était considéré comme un langage pour « scripts rapides », où tout s'exécutait séquentiellement, sans besoin de travail parallèle sérieux. Les temps ont changé. Aujourd'hui, nous construisons avec PHP des API à forte charge, des files d'attente de tâches, des websockets et même des microservices. La question se pose alors : comment faire en sorte que PHP effectue plusieurs tâches simultanément sans tout bloquer ?

\n\n

Dans cet article, nous allons explorer trois approches de la concurrence en PHP : les threads classiques (pthreads), les goroutines légères (Fiber) et la syntaxe moderne async/await. Vous découvrirez des exemples de code concrets, saurez quel outil utiliser selon le contexte, et ce qu'il faut privilégier en 2025.

\n\n

Si vous cherchez à implémenter l'exécution parallèle en PHP pour le traitement de données, ou si vous voulez comprendre en quoi les goroutines PHP diffèrent des threads, vous êtes au bon endroit.

\n\n

1. Multithreading en PHP : pthreads – ancien mais puissant

\n\n

Qu'est-ce que c'est et comment ça marche ?

\n

pthreads est une extension qui permet à PHP de créer de véritables threads système. Chaque thread est une instance distincte du Zend Engine avec sa propre mémoire, mais avec la possibilité d'échanger des données via des objets Threaded.

\n\n

Un point important : pthreads fonctionne uniquement en mode CLI et n'est pas pris en charge dans un environnement web (Apache/Nginx mod_php). En revanche, c'est le seul moyen d'obtenir un vrai parallélisme (et pas seulement de la concurrence) au niveau du processeur.

\n\n

Exemple : parsing parallèle d'URL

\n
<?php\n// Assurez-vous que l'extension pthreads est installée\nclass UrlFetcher extends Thread {\n    private $url;\n    private $result;\n\n    public function __construct(string $url) {\n        $this->url = $url;\n    }\n\n    public function run() {\n        // Exécuté dans un thread séparé\n        $this->result = file_get_contents($this->url);\n    }\n\n    public function getResult() {\n        return $this->result;\n    }\n}\n\n$urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3'];\n$threads = [];\n\nforeach ($urls as $url) {\n    $thread = new UrlFetcher($url);\n    $thread->start(); // Démarre le thread\n    $threads[] = $thread;\n}\n\n// Récupération des résultats\nforeach ($threads as $thread) {\n    $thread->join(); // Attend la fin\n    echo $thread->getResult() . PHP_EOL;\n}\n?>
\n\n

Ce code lance trois threads, chacun téléchargeant sa propre URL. Le temps d'exécution est approximativement égal au temps de la requête la plus lente, et non à la somme des trois. Une excellente illustration de l'exécution parallèle en PHP.

\n\n

Quand utiliser pthreads ?

\n
    \n
  • Tâches CPU intensives (traitement d'images, chiffrement, génération de PDF).
  • \n
  • Parsing de gros volumes de données dans des scripts CLI.
  • \n
  • Quand un vrai parallélisme est nécessaire, et non une multitâche coopérative.
  • \n
\n\n

2. Goroutines en PHP : Fiber – légèreté et contrôle

\n\n

Qu'est-ce que Fiber ?

\n

Depuis PHP 8.1, le langage intègre les Fiber – l'équivalent des goroutines de Go ou des coroutines de Python. Contrairement aux threads, Fiber ne crée pas de processus système séparé. C'est une unité d'exécution légère qui fonctionne dans un seul thread et bascule selon les instructions du développeur.

\n\n

L'idée clé : vous décidez quand suspendre le Fiber actuel et passer la main à un autre. C'est ce qu'on appelle la multitâche coopérative. Idéal pour les opérations I/O (requêtes API, lecture de fichiers, accès à la base de données).

\n\n

Exemple : parcours asynchrone de répertoires

\n
<?php\nfunction readFileAsync(string $path): Fiber {\n    return new Fiber(function () use ($path) {\n        $handle = fopen($path, 'r');\n        $content = '';\n        while (!feof($handle)) {\n            $chunk = fread($handle, 4096);\n            $content .= $chunk;\n            // Suspend le Fiber pour laisser la main à un autre                

Blogs

Book Recommendations