Atteindre le multithreading en PHP

Jinku Hu 30 janvier 2023
  1. Utilisez l’extension de concurrence parallèle Parallel pour réaliser le multithreading en PHP
  2. Utilisez la fonction popen() pour réaliser le multithreading en PHP
Atteindre le multithreading en PHP

Le multithreading est une forme d’exécution de programme, où un seul processus crée plusieurs threads, et ils s’exécutent simultanément. Ce tutoriel discutera du multithreading en PHP et montrera comment y parvenir.

Utilisez l’extension de concurrence parallèle Parallel pour réaliser le multithreading en PHP

En utilisant l’extension de concurrence parallèle Parallel, nous pouvons réaliser le multithreading en PHP.

L’extension fournit un thread interpréteur parallel\Runtime. On peut créer un objet à partir de la classe parallel\Runtime et ainsi créer un thread.

La classe fournit une méthode run() qui planifie l’exécution des tâches en parallèle. Nous pouvons passer Closure comme paramètre à la méthode run.

Le paramètre est généralement appelé task, et nous pouvons également spécifier un tableau comme deuxième paramètre de la méthode. Le contenu du tableau est transmis à la tâche.

Il y a quelques pré-requis avant de télécharger l’extension de concurrence parallèle Parallel. La version de PHP doit être 8.0 et Zend Thread Safe (ZTS) doit être activé.

L’en-tête <pthread.h> est une autre exigence. Nous pouvons télécharger l’extension de pecl comme suit.

pecl install parallel

On peut tester l’exécution parallèle du programme à l’aide de la boucle for.

Par exemple, nous pouvons exécuter une boucle à l’intérieur de la méthode run() et une autre boucle à l’extérieur de la méthode. Dans de telles conditions, l’exécution du code sera parallèle.

Par exemple, créez un objet $rt de la classe parallel\Runtime puis invoquez la méthode run() avec l’objet. Dans la méthode run(), écrivez une fonction anonyme.

Tout d’abord, écrivez une boucle for pour imprimer le signe + cinquante fois à l’intérieur de la fonction. Ensuite, en dehors de la méthode run(), écrivez une autre boucle for pour imprimer le signe - cinquante fois.

Comme la boucle à l’intérieur de la méthode run() s’exécute dans un thread séparé, la boucle à l’extérieur de la méthode run() s’exécutera simultanément. Par conséquent, les signes - et + sont imprimés simultanément, comme indiqué dans la section de sortie ci-dessous.

Par conséquent, nous pouvons utiliser l’extension de concurrence parallèle pour réaliser le multithreading en PHP.

Exemple de code :

$rt = new \parallel\Runtime();

$rt->run(function(){
 for ($i = 0; $i < 50; $i++)
 echo "+";
});

for ($i = 0; $i < 50; $i++) {
 echo "-";
}

Production :

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Utilisez la fonction popen() pour réaliser le multithreading en PHP

Nous pouvons utiliser la fonction popen() pour ouvrir des processus parallèles en PHP.

La fonction bifurque le processus et, par conséquent, un traitement parallèle est réalisé. Il n’y a pas de partage des ressources par les processus.

De cette façon, nous pouvons réaliser le multithreading en PHP. La fonction popen() crée un tuyau vers le processus forké.

Nous pouvons boucler sur la fonction popen() et créer plusieurs processus pour réaliser le multithreading. La fonction popen() prend command comme premier paramètre et mode comme deuxième paramètre.

Le mode peut être r ou w.

Par exemple, créez une boucle for qui boucle cinq fois. À l’intérieur de la boucle, créez une autre boucle for qui boucle cinq fois.

A l’intérieur de la boucle enfant, créez un tableau $process qui stocke la fonction popen(). Définissez le fichier PHP message.php et le mode r comme premier et deuxième paramètres.

Ensuite, créez une autre boucle enfant et utilisez la fonction pclose() pour fermer le $process.

Ici, les cinq processus s’exécutent en parallèle dans la première boucle enfant. Les processus se terminent dans la deuxième boucle enfant avec la fonction pclose().

C’est ainsi que nous pouvons réaliser le multithreading en utilisant la fonction popen() en PHP.

Exemple de code :

for ($i=0; $i<5; $i++) {
 
 for ($j=0; $j<5; $j++) {
 $process[$j] = popen('message.php', 'r');
 }

 for ($j=0; $j<5; ++$j) {
 pclose($process[$j]);
 }
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook