Maison >développement back-end >tutoriel php >PHP est un langage monothread, alors comment Laravel gère-t-il les tâches en file d'attente de manière asynchrone ?

PHP est un langage monothread, alors comment Laravel gère-t-il les tâches en file d'attente de manière asynchrone ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-01 07:24:18383parcourir

PHP is a Single-Threaded Language, So How Does Laravel Handle Queue Jobs Asynchronously?

PHP est connu comme un langage monothread, ce qui signifie qu'il ne peut exécuter qu'une seule tâche à la fois au sein d'un seul processus. Cependant, Laravel fournit un système de file d'attente robuste pour gérer plusieurs tâches de manière « asynchrone ». Si PHP est monothread, comment Laravel réalise-t-il cette magie ? Décomposons-le en termes simples.

Qu'est-ce qu'un processus PHP ?

Avant de plonger dans les files d'attente, nous devons comprendre ce qu'est un processus PHP.

Un processus est comme un travailleur embauché pour accomplir une tâche. Lorsque vous exécutez un script PHP (par exemple php my_script.php), le système d'exploitation crée un nouveau processus. Ce processus :

  • Charge le script PHP.
  • Exécute le code étape par étape.
  • S'arrête et « meurt » lorsque la tâche est terminée. Par exemple:
echo "Hello World!";

Lorsque vous exécutez ce script, PHP démarre un processus, affiche « Hello World ! », puis le processus se termine.

PHP dans les applications Web

Dans les applications web :

  • Un serveur Web (comme Apache ou Nginx) reçoit une requête HTTP d'un navigateur.
  • Le serveur crée un nouveau processus PHP pour gérer la requête.
  • PHP traite la demande (par exemple, récupérer des données à partir d'une base de données ou afficher une page).
  • Le processus se termine après l'envoi d'une réponse au navigateur.
  • Les processus PHP sont de courte durée. Ils traitent une demande à la fois, puis s'arrêtent. Cette conception rend PHP simple et efficace pour les applications Web.

Qu’est-ce que le monothread ?

PHP est monothread, ce qui signifie :

  • Un processus PHP ne peut gérer qu'une seule tâche à la fois.
  • Il n’effectue pas plusieurs tâches simultanément dans le même processus. Par exemple:
echo "Task 1";
// Waits for Task 1 to finish before starting Task 2
echo "Task 2";

PHP exécute la tâche 1 en premier. Ce n'est qu'une fois terminé qu'il passe à la tâche 2. Ce comportement est différent des langages comme JavaScript, où les tâches peuvent s'exécuter en parallèle dans le même processus.

Comment Laravel gère-t-il alors les files d’attente ?

Le système de file d'attente de Laravel vous permet d'exécuter plusieurs tâches en arrière-plan sans bloquer l'application principale. Par exemple :

  • Envoi d'e-mails.
  • Traitement des téléchargements d'images.
  • Envoi de notifications. Ces tâches s'exécutent en arrière-plan, afin que votre application principale puisse répondre plus rapidement aux utilisateurs.

Mais PHP ne peut gérer qu’une seule tâche à la fois, n’est-ce pas ? Comment Laravel fait-il paraître asynchrone ? La réponse réside dans les travailleurs et les processus multiples.

Qu'est-ce qu'un travailleur ?

Un travailleur dans Laravel est un processus PHP de longue durée qui écoute les tâches dans une file d'attente et les exécute.

Lorsque vous exécutez la commande :

php artisan queue:work

Un nouveau processus PHP (ou travailleur) démarre. Ce processus :

  • Se connecte au système de file d'attente (comme Redis ou une base de données).
  • Attend que de nouveaux emplois (tâches) arrivent dans la file d'attente.
  • Récupère et traite les tâches une par une. Exemple : Imaginez que vous ayez pour tâche d'envoyer 1 000 e-mails : L'application principale envoie 1 000 tâches dans la file d'attente. Un processus de travail récupère une tâche, envoie l'e-mail et passe à la tâche suivante.

Comment Laravel parvient-il à un comportement asynchrone ?

Laravel atteint un comportement « asynchrone » en exécutant plusieurs nœuds de calcul en même temps. Chaque travailleur est un processus PHP distinct.

Voici comment cela fonctionne :
Lorsque vous exécutez php artisan queue:work, cela commence avec un seul travailleur (un processus PHP).
Vous pouvez démarrer plusieurs travailleurs pour traiter des tâches en parallèle sur différents onglets localement et en production en utilisant le gestionnaire de processus comme le superviseur.
Cela démarrera plusieurs processus PHP. Chaque travailleur gère les tâches de manière indépendante, ce qui donne l'impression que les tâches s'exécutent simultanément.

Que se passe-t-il lorsqu'une tâche est mise en file d'attente ?

Lorsque vous mettez une tâche en file d'attente dans Laravel, voici ce qui se passe étape par étape :

  1. Création d'emplois : Le travail (par exemple, envoyer un e-mail) est sérialisé (converti dans un format stockable) et ajouté au backend de la file d'attente (comme Redis ou une base de données).
  2. Un employé interroge la file d'attente : Les travailleurs vérifient continuellement la file d'attente pour trouver de nouveaux emplois. Si un emploi est trouvé, le travailleur le récupère.
  3. Exécution du travail : Le travailleur désérialise le travail et exécute sa méthode handle(). Une fois terminé, le travail est marqué comme terminé.
  4. Achèvement du travail : Le travailleur supprime le travail de la file d'attente.

Si le travail échoue, Laravel le réessaye ou le déplace vers une liste de « travaux ayant échoué » (en fonction de votre configuration).

Exemple de scénario : envoi d'e-mails
Imaginez que vous ayez une application Laravel dans laquelle les utilisateurs soumettent un formulaire de contact. Lorsque le formulaire est soumis :

  • L'application principale traite le formulaire et répond immédiatement à l'utilisateur.
  • Au lieu d'envoyer l'e-mail immédiatement, il ajoute la tâche d'envoi d'e-mail à une file d'attente.

En arrière-plan :

  • Un employé récupère la tâche d'envoi d'e-mails.
  • Envoie l'e-mail.
  • Passe au travail suivant.
  • De cette façon, l'utilisateur n'a pas à attendre que l'e-mail soit envoyé, ce qui rend l'application plus rapide.

Comment les travailleurs fonctionnent-ils dans la production ?

En production, les travailleurs de Laravel sont gérés par des outils comme Supervisor. Le superviseur fait fonctionner les travailleurs 24 heures sur 24, 7 jours sur 7 et les redémarre en cas de panne.

Exemple de configuration du superviseur :

echo "Hello World!";

commande : exécute la commande queue:work.
numprocs=5 : démarre 5 workers (5 processus PHP) pour gérer les tâches.

Est-ce vraiment asynchrone ?

Techniquement, les files d'attente Laravel ne sont pas asynchrones dans la manière dont JavaScript ou Node.js gèrent les tâches. Au lieu de cela :

Chaque travailleur gère un travail à la fois.
Plusieurs travailleurs (processus) assurent le parallélisme, donnant l'apparence d'une exécution asynchrone.

Points clés à retenir

  • PHP est monothread, donc un seul processus PHP gère une tâche à la fois.
  • Laravel utilise des Workers (processus PHP de longue durée) pour traiter les tâches en file d'attente.
  • Plusieurs travailleurs peuvent s'exécuter simultanément, ce qui permet de traiter les tâches en parallèle.
  • Les backends de file d'attente (comme Redis) agissent comme intermédiaires pour stocker les tâches jusqu'à ce que les travailleurs les récupèrent.
  • Des outils tels que Supervisor garantissent que les travailleurs fonctionnent en continu en production.

Le système de file d'attente de Laravel est un moyen intelligent de gérer les tâches en arrière-plan, améliorant ainsi les performances des applications et l'expérience utilisateur. Alors que PHP lui-même est monothread, Laravel atteint le parallélisme en exécutant plusieurs processus (workers). Cette conception simple mais efficace permet à Laravel de gérer de lourdes charges de travail, même avec les limitations de PHP.

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!

Déclaration:
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