Vous apprendre à utiliser la bibliothèque spatie/async pour écrire du code PHP asynchrone

藏色散人
Libérer: 2023-04-09 16:24:02
avant
5333 Les gens l'ont consulté

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";
}
Copier après la connexion

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);
Copier après la connexion

Lorsque nous exécuterons le premier code, nous ferons ce qui suit Obtenez le valeur de sortie :

2
4
6
8
10
Copier après la connexion

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
Copier après la connexion

Deuxième tentative d'exécution :

2
6
4
10
8
Copier après la connexion

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
Copier après la connexion

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 :

  • Exécutez à nouveau l'opération lorsque la tâche est terminée car le rappel peut être implémenté via sa méthode then.
  • Lorsqu'une tâche spécifique lève une exception à l'aide de la méthode catch, la gestion des erreurs est plus facile à contrôler.
  • La méthode 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 () {
        // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
    })
;
Copier après la connexion

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!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!