Recommandé : "Tutoriel vidéo PHP"
Pour la plupart des programmes écrits en PHP, son seul objectif est d'exécuter un processus simple composé de plusieurs tâches, où les tâches doivent être effectués de manière séquentielle, comme le traitement des données. Nous devons toujours supporter l'arrêt et l'attente de la programmation synchrone. Le style synchrone d’exécution du code est appelé blocage, ce qui signifie que les tâches seront exécutées les unes après les autres. Et si nous voulons exécuter des tâches sans qu’elles se bloquent les unes les autres, ce qui signifie que nous avons besoin d’un processus non bloquant ? Cette approche nécessite l'application de méthodes de programmation asynchrone en PHP, où les tâches seront exécutées sans interdépendance.
Un moyen courant d'obtenir une exécution non bloquante en PHP consiste à implémenter le traitement de file d'attente. Les tâches sont conservées dans un transport tel que MySQL, Redis, Amazon SQS, etc., qui est récupéré par un travailleur en arrière-plan et exécuté en conséquence sans bloquer le processus principal qui a créé la tâche. Les applications Laravel fournissent un mécanisme de mise en file d'attente qui permet aux tâches (appelées tâches dans ce cas) d'être reportées à une date ultérieure pour traitement.
Une autre approche consiste à exécuter toutes les tâches définies en parallèle. Ce que nous savons de cette approche, c'est que dès qu'une tâche spécifique est terminée, elle peut redonner le contrôle au processus principal avec la promesse d'exécuter le code et de nous informer des résultats plus tard (par exemple, rappel). On peut rarement voir des cas d'utilisation de méthodes de traitement parallèle ; un exemple de cas d'utilisation pourrait être d'effectuer un traitement d'image et de faire une requête GET à un service externe.
Regardons la différence entre les processus synchrones et asynchrones (parallèles) en PHP à travers un cas d'utilisation très simple.
Code synchrone
foreach (range(1, 5) as $i) { $output = $i * 2; echo $output . "\n"; }
Code asynchrone
use Spatie\Async\Pool; $pool = Pool::create(); foreach (range(1, 5) as $i) { $pool[] = async(function () use ($i) { $output = $i * 2; return $output; })->then(function (int $output) { echo $output . "\n"; }); } await($pool);
Lorsque nous exécuterons le premier code, nous ferons ce qui suit Obtenez le valeur de sortie :
2 4 6 8 10
Réessayez l'exécution et nous obtiendrons la même séquence de sortie que ci-dessus. Par conséquent, chaque opération de multiplication attend d’être exécutée avant l’opération de multiplication suivante. Ensuite, exécutez le deuxième bloc de code et voyons ce que nous obtenons.
6 10 2 8 4
Deuxième tentative d'exécution :
2 6 4 10 8
Un processus produit deux résultats différents. C'est exactement ce que nous obtenons en utilisant des méthodes asynchrones. Nos petites tâches peuvent être exécutées de manière non bloquante. Chaque tâche de multiplication est exécutée indépendamment, certaines plus rapidement que d'autres, de sorte que la sortie est confuse. Notez également que notre fonction async est attachée en tant que méthode then, qui est chargée de reprendre le contrôle, et qu'elle accepte une fonction de rappel comme argument, qui peut désormais effectuer des actions supplémentaires sur la sortie reçue.
Les gens de Spatie ont développé ce joli spacee/async
package qui aide à exécuter des tâches en parallèle. Vous pouvez installer ce package via Composer :
composer require spatie/async
Ce package fournit un moyen simple d'interagir avec les tâches créées qui seront exécutées en parallèle. L'écouteur d'événements de la tâche est décrit comme suit :
then
. catch
, la gestion des erreurs est plus facile à contrôler. timeout
permet de gérer un tel scénario lorsqu'une tâche ne termine pas son opération. L'écouteur d'événement est connecté à une tâche comme celle-ci :
$pool ->add(function () { // 要在并行进程中执行的任务 }) ->then(function ($output) { // 如果成功,进程或者你传递到队列的回调函数会返回`$output`。 }) ->catch(function ($exception) { // 当进程内抛出异常时,它会被捕获并传递到这里。 }) ->timeout(function () { // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧 }) ;
Pour en savoir plus sur ce package spacee/async
, lisez ceci dans l'article d'un de ses contributeurs, vous pouvez également reportez-vous au référentiel GitHub.
Adresse originale : https://dev.to/webong/using-asynchronous-processes-in-php-7io
Adresse de traduction : https://learnku.com/ php/t/51334
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!