it-swarm.com.de

So halten Sie das Laravel Queue-System auf dem Server

Ich habe vor kurzem ein Laravel Queue-System eingerichtet. Die Grundlagen sind ein Cronjob, der einen Befehl aufruft, der einer Warteschlange Jobs hinzufügt, und einen zweiten Befehl aufruft, der eine E-Mail sendet. 

Das System funktioniert, wenn ich ssh in meinen Server einführe und die php artisan queue: listen, aber wenn ich mein Terminal schließe, wird der Listener heruntergefahren, und die Jobs stapeln sich und sitzen in der Warteschlange, bis ich wieder ssh einschalte und wieder listen.

Wie kann ich mein Warteschlangensystem am besten laufen lassen, ohne meine Verbindung über ssh geöffnet zu haben?

Ich habe versucht, php artisan queue:work --daemon auszuführen. Dadurch wurden die Jobs in der Warteschlange abgeschlossen, aber als ich mein Terminal geschlossen hatte, wurden die Verbindung und der Hintergrundprozess geschlossen.

34
zeros-and-ones

Der Befehl 

Nohup php artisan queue:work --daemon &

richtig war, würde der Prozess nach dem Schließen der SSH-Verbindung fortgesetzt werden können; Dies ist jedoch nur eine kurzfristige Lösung. Sobald der Server neu gestartet wurde oder ein Problem auftritt, wird der Prozess angehalten, und Sie müssen den Befehl erneut ausführen. Wann das passiert, weiß man nie. Es kann an einem Freitagabend passieren, daher ist es besser, eine langfristige Lösung zu implementieren.

Ich habe letztendlich auf Supervisord umgestellt, dies kann so einfach auf Ubuntu installiert werden 

Sudo apt-get install supervisor 

Für AWS-AMI- oder RedHat-Benutzer können Sie den Anweisungen folgen, die ich in dieser Frage beschrieben habe:

Einrichten von Supervisord auf einem AWS AMI Linux-Server

10
zeros-and-ones

Laufen 

Nohup php artisan queue:work --daemon &

Verhindert, dass der Befehl beendet wird, wenn Sie sich abmelden.

Das nachfolgende kaufmännische Und (&) bewirkt, dass der Prozess im Hintergrund gestartet wird. Sie können also die Shell weiterhin verwenden und müssen nicht warten, bis das Skript abgeschlossen ist.

Siehe Nohup

Nohup - Führt einen Befehl aus, der immun gegen Hangups ist und die Ausgabe an einen Nicht-TT-Empfänger erfolgt

Dadurch werden Informationen in einer Datei mit dem Namen Nohup.out in dem Verzeichnis ausgegeben, in dem Sie den Befehl ausführen. Wenn Sie kein Interesse an der Ausgabe haben, können Sie stdout und stderr nach/dev/null umleiten. In ähnlicher Weise können Sie es auch in Ihr normales Laravel-Protokoll ausgeben. Zum Beispiel

Nohup php artisan queue:work --daemon > /dev/null 2>&1 &

Nohup php artisan queue:work --daemon > app/storage/logs/laravel.log &

Sie sollten jedoch auch etwas wie Supervisord verwenden, um sicherzustellen, dass der Dienst weiterhin ausgeführt wird und nach Abstürzen/Ausfällen neu gestartet wird.

46
Ben Swinburne

Sie sollten Linux Supervisor verwenden. 

Die Installation ist einfach und auf Ubuntu kann ich es mit folgendem Befehl installieren:

apt-get install supervisor

Supervisor-Konfigurationsdateien befinden sich im Verzeichnis /etc/supervisor/conf.d.

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel-example/artisan queue:work redis --queue=emailqueue --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel-example//storage/logs/supervisord.log

Für jeden Prozess sollten Sie eine neue Prozesskonfigurationsdatei erstellen. Bei dieser Konfiguration wiederholt der Listener jeden Job dreimal. Supervisor startet auch den Listener erneut, wenn er fehlschlägt oder das System neu startet.

14
Manish Nakar

Von https://Gist.github.com/ivanvermeyen/b72061c5d70c61e86875

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class EnsureQueueListenerIsRunning extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'queue:checkup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Ensure that the queue listener is running.';

    /**
     * Create a new command instance.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if ( ! $this->isQueueListenerRunning()) {
            $this->comment('Queue listener is being started.');
            $pid = $this->startQueueListener();
            $this->saveQueueListenerPID($pid);
        }

        $this->comment('Queue listener is running.');
    }

    /**
     * Check if the queue listener is running.
     *
     * @return bool
     */
    private function isQueueListenerRunning()
    {
        if ( ! $pid = $this->getLastQueueListenerPID()) {
            return false;
        }

        $process = exec("ps -p $pid -opid=,cmd=");
        //$processIsQueueListener = str_contains($process, 'queue:listen'); // 5.1
        $processIsQueueListener = ! empty($process); // 5.6 - see comments

        return $processIsQueueListener;
    }

    /**
     * Get any existing queue listener PID.
     *
     * @return bool|string
     */
    private function getLastQueueListenerPID()
    {
        if ( ! file_exists(__DIR__ . '/queue.pid')) {
            return false;
        }

        return file_get_contents(__DIR__ . '/queue.pid');
    }

    /**
     * Save the queue listener PID to a file.
     *
     * @param $pid
     *
     * @return void
     */
    private function saveQueueListenerPID($pid)
    {
        file_put_contents(__DIR__ . '/queue.pid', $pid);
    }

    /**
     * Start the queue listener.
     *
     * @return int
     */
    private function startQueueListener()
    {
        //$command = 'php-cli ' . base_path() . '/artisan queue:listen --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.1
        $command = 'php-cli ' . base_path() . '/artisan queue:work --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.6 - see comments
        $pid = exec($command);

        return $pid;
    }
}
4
Harry Bosh

1) Sudo apt install supervisor oder

Sudo apt-get install supervisor

2) cd /etc/supervisor/conf.d 3) Neue Datei erstellen

Sudo vim queue-worker.conf

Dateiinhalt

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/laravelproject/artisan queue:work
autostart=true
autorestart=true
user=root
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/html/laravelproject/storage/logs/supervisord.log

4) Sudo supervisorctl reread

wenn dieser Befehl ausgeführt wird, wird der Ausgabe-Queue-Worker abgerufen: available

5) Sudo supervisorctl update

wenn dieser Befehl ausgeführt wird, wird die Ausgabe-Warteschlangen-Worker: Prozessgruppe hinzugefügt

anderer Befehl

1) Sudo supervisorctl reload

wenn Sie diesen Befehl ausführen, erhalten Sie die Ausgabe Restarted supervisord

2) Sudo service supervisor restart

3
Lalit Baghel

Für diejenigen, die bereits NodeJS in ihren Produktionsumgebungen ausführen. Ich verwende PM2 zum Verwalten von App-Prozessen.

# install
npm install -g pm2

# in project dir with your CI or dev setup tool 
# --name gives task a name so that you can later manage it
# -- delimits arguments that get passed to the script
pm2 start artisan --interpreter php --name queue-worker -- queue:work --daemon

Ich verwende Vagrant bei der Entwicklung und Einrichtung von NodeJS und bei diesem Prozess nur inline Vagrant-Skripts.

Wenn Sie PM2 in der Entwicklung verwenden, können Sie einen der vielen Beobachter verwenden, um den Neustart zu verwalten. Führen Sie einfach pm2 restart queue-worker aus, wenn Sie eine Änderung abholen. In der Produktion empfehle ich diesen Ansatz nicht, sondern wähle ein Build-Tool, das diesem Prozess folgen kann.

# 1. stop pm task to ensure that no unexpected behaviour occurs during build
pm2 stop queue-worker
# 2. do your build tasks
...
# 3. restart queue so that it loads the new code
pm2 restart queue-worker
3
dewwwald

Was ist, wenn Sie die Wiedergabe innerhalb eines Bildschirms starten? Siehe hier: http://aperiodic.net/screen/quick_reference Auch wenn Sie sich abmelden, ist der Bildschirm immer noch aktiv. Nicht sicher, warum die Daemonisierung nicht funktioniert.

2
grasshopper

Da dies eine Laravel-spezifische Frage war, dachte ich, ich würde eine Lravel-spezifische Antwort vorschlagen. Da Sie bereits Cronjobs auf diesem Server verwenden, würde ich empfehlen, dass Sie den Shell-Befehl als wiederkehrenden Cronjob einrichten, um immer zu überprüfen, ob der Worker ausgeführt wird. Sie können den Shell-Befehl so einrichten, dass er nativ über cron auf Ihrem Server ausgeführt wird, oder Sie können den Laravel-Konsolenkernel verwenden, um den Befehl zu verwalten und Logik hinzuzufügen. So können Sie beispielsweise überprüfen, ob bereits ein Worker ausgeführt wird und starten Sie es wieder.

Je nachdem, wie oft Sie Ihren Befehl ausführen müssen, können Sie dies einmal wöchentlich oder sogar einmal pro Minute tun. Auf diese Weise können Sie sicherstellen, dass Ihre Mitarbeiter kontinuierlich arbeiten, ohne dass ein zusätzlicher Aufwand für Ihren Server wie Supervisor erforderlich ist. Wenn Sie einem Drittanbieter-Paket wie Supervisor Berechtigungen erteilen, ist dies in Ordnung, wenn Sie ihm vertrauen. Wenn Sie jedoch vermeiden möchten, dass Sie sich auf dieses Paket verlassen müssen, sollten Sie stattdessen diesen Ansatz in Betracht ziehen.

Ein Beispiel dafür, wie Sie das tun können, was Sie möchten, wäre ein Cronjob, der jede Stunde ausgeführt wird. In einem benutzerdefinierten Laravel-Konsolenbefehl wird Folgendes in sequentieller Reihenfolge ausgeführt:

\ Artisan :: call ('queue: restart');

\ Artisan :: call ('queue: work --daemon');

Beachten Sie, dass dies für ältere Laravel-Versionen (bis zu Version 5.3) gilt, ich habe jedoch keine neueren Versionen getestet.

2
eResourcesInc

Verwenden von pm2

Ich hatte ein JS-Skript mit pm2 (Advanced, Produktionsprozessmanager für Node.js). Das war das einzige, das ich ausführte. Aber jetzt, da ich noch einen Prozess habe, um weiterzumachen. 

Ich habe process.yml erstellt, um beide mit einem einzigen Befehl auszuführen. Überprüfen Sie, ob der erste Code php artisan queue: listen ausgeführt wird.

# process.yml at /var/www/ which is root dir of the project
apps:
  # Run php artisan queue:listen to execute queue job
  - script    : 'artisan'
    name      : 'artisan-queue-listen'
    cwd       : '/var/www/'
    args      : 'queue:listen' # or queue:work
    interpreter : 'php'

  # same way add any other script if any.

Jetzt ausführen:

> Sudo pm2 start process.yml

Überprüfen Sie mehr Optionen und Funktionen von pm2

1
Lahar Shah

Der beste Weg ist PM2 (Advanced, Production Process Manager für Node.js), mit dem Sie Ihre Warteschlangen überwachen und ihre Protokolle anzeigen können.

führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus, und führen Sie den Warteschlangen-Worker aus:

pm2 start artisan --name laravel-worker --interpreter php -- queue:work --daemon
1
faridcs

Sie können monit tool verwenden. Es ist sehr klein und für jede Art von Prozessverwaltung und -überwachung nützlich.

Nach dem Herunterladen des Binärpakets von diesem Link können Sie es in einen Ordner auf Ihrem System extrahieren und dann zwei Dateien aus dem Paket auf Ihr System kopieren, um es zu installieren: 

cd /path/to/monit/folder
cp ./bin/monit /usr/sbin/monit
cp ./conf/monitrc /etc/monitrc  

Bearbeiten Sie nun /etc/monitrc nach Ihren Bedürfnissen ( Referenzdokument ). Erstellen Sie dann eine init-Steuerdatei , um die Überwachung beim Start zu aktivieren. Starten Sie jetzt wie folgt: 

initctl reload-configuration
start monit
0
Ghasem Pahlavan

Ich habe einfach php artisan queue:work --tries=3 & verwendet, wodurch der Prozess im Hintergrund läuft . Aber manchmal hört er auf

0
Kevin RED