Was ist der Unterschied zwischen queue: work --daemon und queue: listen

70

Ich richte meinen Offline-Jobserver ein. Ich habe die Dokumentation gelesen, sehe aber immer noch nicht wirklich die Unterschiede zwischen den beiden Befehlen: artisan queue:work --daemonund artisan queue:listen. Welchen Befehl soll ich zum Ausführen meiner Daemons verwenden?

Logan Bailey
quelle

Antworten:

131

Bearbeiten aktualisiert 2017-04-07:

Es gibt jetzt drei Möglichkeiten, Ihre Warteschlange auszuführen:

  • queue:work- Dies ist der neue "Daemon" -Prozess (das Flag wird nicht mehr benötigt). Das Framework wird "einmal" gestartet - und dann die Jobs weiter durchlaufen. Dies wird auf unbestimmte Zeit fortgesetzt. Es verbraucht weniger Speicher / CPU als queue:listenweil das Framework die ganze Zeit aktiv bleibt. Sie müssen auch daran denken, queue:restartdie Warteschlange zu verwenden, um alle Codeänderungen zu aktualisieren, die Sie während des Patchens übertragen.

  • queue:work --once- Dadurch wird das Framework gestartet, ein Job verarbeitet und dann heruntergefahren. Nützlich zum Testen während der Entwicklung usw.

  • queue:listen- Dadurch wird das Framework in jedem Zyklus gestartet, ein Job verarbeitet, dann vollständig heruntergefahren und dann das Framework erneut gestartet usw. und eine unbegrenzte Schleife ausgeführt. Dies bedeutet, dass alle Speicher / Prozesse nach der Verarbeitung jedes Jobs freigegeben werden. Wenn Sie Speicherlecks mit haben queue:work- probieren Sie es aus.

Das --daemonFlag wirkt sich nicht mehr auf diese Befehle aus.

Ursprüngliche Antwort:

Es sind zwei verschiedene Probleme aufgeführt.

Es gibt artisan queue:workundartisan queue:listen

  • queue:workwird einfach den nächsten Job in der Warteschlange entfernen und nur diesen einen Job verarbeiten. Dies ist ein einmaliger Befehl, der zur Verarbeitung der Eingabeaufforderung zurückkehrt, sobald der Befehl für eine Warteschlange verarbeitet wird.
  • queue:listenhört die Warteschlange ab und verarbeitet weiterhin alle empfangenen Warteschlangenbefehle. Dies läuft unbegrenzt weiter, bis Sie es stoppen.

In Laravel> = 4.2 wurde ein --daemonBefehl hinzugefügt. Die Funktionsweise besteht einfach darin, die Warteschlangen direkt auszuführen, anstatt das gesamte Framework neu zu starten, nachdem jede Warteschlange verarbeitet wurde. Dies ist ein optionaler Befehl, der den Speicher- und CPU-Bedarf Ihrer Warteschlange erheblich reduziert.

Der wichtige Punkt mit dem --daemonBefehl ist, dass Sie beim Aktualisieren Ihrer Anwendung Ihre Warteschlange speziell neu starten müssen queue:restart, da sonst möglicherweise alle möglichen seltsamen Fehler auftreten können, da Ihre Warteschlange immer noch den alten Code im Speicher hat.

Um Ihre Frage " Welchen Befehl soll ich zum Ausführen meiner Dämonen verwenden? " Zu beantworten, lautet die Antwort fast immerqueue:work --daemon

Laurence
quelle
Wie kann ich den Daemon im Hintergrund ausführen? Wo soll ich Code einfügen, um die Warteschlange neu zu starten?
Dev
2
Wenn Sie mit dem Flag --daemon arbeiten, müssen Sie die Speicherwarnung in den Dokumenten ernst nehmen. Wenn Sie große Dateien verarbeiten oder andere speicherintensive Aufgaben ausführen, wird der Prozess wahrscheinlich mindestens einen Teil des Speichers verlieren und schließlich abstürzen. Ich habe sogar versucht, Speicher in diesen Jobs mit wenig Erfolg freizugeben. Verwenden Sie Supervisor besser, um neue Queue :: Work-Prozesse zu erzeugen.
ShaunUK
1
Ich verstehe immer noch nicht, was der Unterschied zwischen queue: listen und queue: work --daemon ist. queue: listen läuft unbegrenzt und queue: work --daemon läuft auch unbegrenzt, ohne das Framework neu zu laden. Was ist also der Unterschied?
Armen Markossyan
Es scheint wie Arbeit und Hören so ziemlich dasselbe, mit einigen Unterschieden unter der Haube. Wie können Sie die Warteschlange verarbeiten und dann beenden, ohne auf weitere Ereignisse zu warten?
Lucas
1
@ Lucas - ja, richtig. Sie bearbeiten entweder einen Job und beenden ihn oder Sie bearbeiten ihn auf unbestimmte Zeit. Dazwischen gibt es kein.
Laurence
16

Die Dinge wurden geändert, aber es wurde im Dokument nicht erwähnt

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

php artisan queue:workläuft jetzt standardmäßig im Daemon-Modus,

queue:workVerarbeiten Sie also weiterhin Jobs, ohne das Framework jemals neu zu starten

für run it einmal Befehl ist,

php artisan queue:work --once

Alupotha
quelle
5

Der wichtigste Unterschied besteht darin , dass queue:work --daemonnicht den Rahmen für jedes nicht neu starten , Job , aber queue:listen tut . Tatsächlich listenwird für jeden Job ein ganz neuer Laravel-Prozess gestartet.

Probieren Sie es aus: Öffnen Sie 2 Terminals und führen Sie das work --daemoneine und listendas andere aus. Das workFenster führt Jobs viel schneller aus als listen.

Simon Fredsted
quelle
0

Ab Laravel 5.7 wurde --stop-when-emptydem queue:workBefehl eine neue Option hinzugefügt . Wenn Sie diese Option verwenden, wird die aktuelle Warteschlange verarbeitet, bis sie leer ist. Anschließend wird der Befehl beendet.

Laut Dokumentation :

Die Option --stop-when-empty kann verwendet werden, um den Worker anzuweisen, alle Jobs zu verarbeiten und dann ordnungsgemäß zu beenden. Diese Option kann nützlich sein, wenn Sie Laravel-Warteschlangen in einem Docker-Container bearbeiten, wenn Sie den Container herunterfahren möchten, nachdem die Warteschlange leer ist:

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