Concurrence et multithreading en PHP : de A à Z

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 concurrence et au multithreading en PHP

PHP est traditionnellement considéré comme un langage synchrone et monothread. Cependant, les applications web modernes nécessitent le traitement de multiples tâches simultanément : téléchargement de fichiers, travail avec des API, traitement de files d'attente. La concurrence et le multithreading en PHP permettent de résoudre ces problèmes, en accélérant l'exécution des scripts et en améliorant la réactivité des applications.

Dans cet article, nous aborderons les concepts clés : des principes de base de la concurrence à l'application pratique des extensions pthreads et parallel. Vous apprendrez à organiser l'exécution parallèle des tâches, à éviter les conditions de course et à améliorer les performances de votre code PHP.



Concepts fondamentaux de la concurrence et du multithreading

Synchronisme vs Asynchronisme

Dans le modèle synchrone, PHP exécute le code strictement séquentiellement. Si un script effectue une requête HTTP, l'exécution s'arrête jusqu'à la réception de la réponse. L'asynchronisme permet de lancer des tâches sans attendre leur achèvement.

Exemple de code synchrone :

<?php$result1 = file_get_contents('https://api.example.com/data1');$result2 = file_get_contents('https://api.example.com/data2');// Les deux requêtes sont exécutées séquentiellement?>


Threads et processus

  • Processus — copie isolée d'un programme avec son propre espace d'adressage.
  • Thread — unité d'exécution légère à l'intérieur d'un processus, partageant la mémoire.

En PHP, le multithreading est implémenté via des threads. Leur utilisation nécessite des extensions spéciales, car la version standard de PHP ne prend pas en charge les threads.



Condition de course et synchronisation

Lorsque plusieurs threads travaillent sur des données partagées, une condition de course (race condition) peut survenir. Pour l'éviter, on utilise des mutex, des verrous et des opérations atomiques.



Outils pour le multithreading en PHP

Extension pthreads

pthreads — l'une des premières extensions pour travailler avec les threads. Elle fournit les classes Thread, Worker et Pool. Important : l'extension fonctionne uniquement en mode CLI et nécessite une compilation PHP avec ZTS (Zend Thread Safety).

Exemple d'un thread simple :

<?phpclass MyThread extends Thread {    public function run() {        echo "Thread lancé";    }}$thread = new MyThread();$thread->start();$thread->join();?>


Extension parallel

parallel — une extension plus moderne, apparue avec PHP 7.4. Elle est plus pratique et plus sûre. Elle fonctionne via des canaux (channels) pour transférer des données entre les threads.

Exemple avec parallel :

<?php$runtime = new \\parallel\\Runtime();$future = $runtime->run(function(){    return "Bonjour depuis le thread parallèle !";});echo $future->value(); // On récupère le résultat?>


Asynchronisme avec ReactPHP et Amp

Si vous n'avez pas besoin de véritable multithreading mais seulement de concurrence, utilisez les bibliothèques d'entrée-sortie asynchrones :

  • ReactPHP — bibliothèque orientée événements avec une boucle d'événements (event loop).
  • Amp — async/await pour PHP, similaire à JavaScript.


Exemples pratiques et bonnes pratiques

Exemple : Traitement parallèle d'URL

Supposons que vous deviez vérifier la disponibilité de 10 sites. En mode synchrone, cela prendrait beaucoup de temps. Utilisons parallel pour accélérer :

<?php$urls = [    'https://google.com',    'https://yandex.ru',    'https://github.com'];

$runtimes = [];$futures = [];

foreach ($urls as $url) { $runtime = new \\parallel\\Runtime(); $runtimes[] = $runtime; $futures[] = $runtime->run(function($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 5);

Blogs

Book Recommendations