web-dev-qa-db-fra.com

Quelle est la différence entre queue: work --daemon et queue: listen

Je configure mon serveur de travaux hors ligne. J'ai lu la documentation mais je ne vois toujours pas vraiment les différences entre les deux commandes: artisan queue:work --daemon et artisan queue:listen. Quelle commande dois-je utiliser pour exécuter mes démons?

62
Logan Bailey

Modifier la mise à jour le 2017-04-07:

Il existe maintenant trois façons d'exécuter votre file d'attente:

  • queue:work - c'est le nouveau processus "démon" (l'indicateur n'est plus requis). Le cadre se déclenche "une fois" - puis continue à parcourir les tâches. Cela continuera indéfiniment. Il utilise moins de mémoire/cpu que queue:listen car le framework reste en place tout le temps. Vous devez également vous rappeler d'utiliser queue:restart pour forcer la file d'attente à mettre à jour les modifications de code que vous envoyez pendant l'application des correctifs.

  • queue:work --once - cela lancera le framework, traitera une tâche, puis s'arrêtera. Utile pour les tests pendant le développement, etc.

  • queue:listen - cela déclenchera le framework à chaque cycle, traitera une tâche, puis s'arrêtera complètement, puis redémarrera le framework, etc. et bouclera indéfiniment. Cela signifie que toute la mémoire/tous les processus sont libérés après le traitement de chaque travail. Si vous avez des fuites de mémoire avec queue:work - essayez ceci.

Le --daemon flag n'a plus d'effet sur ces commandes.

Réponse originale:

Deux problèmes différents sont répertoriés.

Il y a artisan queue:work et artisan queue:listen

  • queue:work supprimera simplement le travail suivant dans la file d'attente et ne traitera que ce travail. Il s'agit d'une commande "unique" qui reviendra à l'invite de commandes une fois la commande d'une file d'attente traitée.
  • queue:listen écoutera la file d'attente et continuera de traiter toutes les commandes de file d'attente qu'il reçoit. Cela continuera de fonctionner indéfiniment jusqu'à ce que vous l'arrêtiez.

Dans Laravel> = 4.2 il y avait un --daemon commande ajoutée. La façon dont cela fonctionne est simplement de continuer à exécuter les files d'attente directement, plutôt que de redémarrer l'intégralité du framework après le traitement de chaque file d'attente. Il s'agit d'une commande facultative qui de manière significative réduit les besoins en mémoire et en CPU de votre file d'attente.

Le point important avec le --daemon commande est que lorsque vous mettez à niveau votre application, vous devez redémarrer spécifiquement votre file d'attente avec queue:restart, sinon vous pourriez potentiellement obtenir toutes sortes d'erreurs étranges car votre file d'attente aurait toujours l'ancien code en mémoire.

Donc, pour répondre à votre question " Quelle commande dois-je utiliser pour exécuter mes démons? " - la réponse est presque toujours queue:work --daemon

115
Laurence

Les choses ont changé mais cela n'a pas été mentionné dans le document

 --daemon  Run the worker in daemon mode (Deprecated)

maintenant par défaut php artisan queue:work s'exécute en mode démon,

alors queue:work poursuivre le traitement des travaux sans jamais redémarrer le framework

pour l'exécuter une fois la commande est,

php artisan queue:work --once

16
Alupotha

La différence la plus importante est que queue:work --daemon ne redémarre pas le framework sur chaque job, mais queue:listenfait. En fait, listen démarre un tout nouveau processus Laravel pour chaque tâche).

Essayez par vous-même: ouvrez 2 terminaux et exécutez work --daemon dans l'un et listen dans l'autre. La fenêtre work exécutera les tâches beaucoup plus rapidement que listen.

5
Simon Fredsted

À partir de Laravel 5.7 une nouvelle option --stop-when-empty a été ajouté au queue:work commande. Lorsque vous utilisez cette option, la file d'attente actuelle est traitée jusqu'à ce qu'elle soit vide, puis la commande se termine.

Selon la documentation :

L'option --stop-when-empty peut être utilisée pour demander au travailleur de traiter tous les travaux, puis de quitter correctement. Cette option peut être utile lorsque vous travaillez Laravel files d'attente dans un conteneur Docker si vous souhaitez arrêter le conteneur une fois la file d'attente vide:

php artisan queue:work --stop-when-empty
0
PtrTon