2015-12-28 19 views
5

Die SituationWarum sind meine Laravel Queue Jobs nach 60 Sekunden fehlgeschlagen?

ich Laravel Queues bin mit einer großen Anzahl von Mediendateien zu bearbeiten, einzelne Aufträge Minuten in Anspruch nehmen soll (lets bis zu einer Stunde nur sagen).

Ich verwende Supervisor, um meine Warteschlange auszuführen, und ich führe 20 Prozesse gleichzeitig aus. Mein Vorgesetzter Konfigurationsdatei sieht wie folgt aus:

[program:duplitron-worker] 
process_name=%(program_name)s_%(process_num)02d 
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1 
autostart=true 
autorestart=true 
user=duplitron 
numprocs=20 
redirect_stderr=true 
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log 

Es gibt ein paar Merkwürdigkeiten, dass ich weiß nicht, wie oder richtig zu erklären:

  1. Meine Jobs ziemlich konsequent scheitern nach 60 bis 65 Sekunden laufen .
  2. Nachdem der Auftrag als fehlgeschlagen markiert wurde, wird weiterhin ausgeführt, auch nachdem er als fehlgeschlagen markiert wurde. Schließlich werden sie erfolgreich aufgelöst.
  3. Wenn ich run the failed task in isolation die Ursache des Problems finden, ist es gut gelungen.

Ich glaube fest, dass dies ein Timeout-Problem ist; Ich hatte jedoch den Eindruck, dass zu einem unbegrenzten Timeout führen würde.

Die Frage

Wie kann ich diesen temporären "failure" Job-Status zu verhindern? Gibt es andere Stellen, an denen ein Warteschlangen-Timeout ausgelöst werden könnte, die mir nicht bekannt sind?

+1

Überprüfen Sie die 'max_execution_time' php.ini Wie viel sagt das? Wenn es 60 Sekunden ist, gibt es Ihr Problem. Versuchen Sie, das Zeitlimit zu erhöhen. –

+0

Toller Gedanke @WillyPt - würden die php.ini Einstellungen nicht das gesamte Skript beenden? Es löst sich weiter auf. (FWIW 'max_execution_time' wurde auf 30s gesetzt, ich erkunde und experimentiere entlang dieser Zeilen). – slifty

Antwort

10

Es stellt sich heraus, dass zusätzlich zu Timeout es eine expire Einstellung in config/queue.php

'database' => [ 
     'driver' => 'database', 
     'table' => 'jobs', 
     'queue' => 'default', 
     'expire' => 60, 
    ], 

dass der Trick auf einen höheren Wert ändert definiert ist getan.

2

Wichtiger Hinweis: "expire" heißt jetzt "retry_after" (Laravel 5.4)

Verwandte Themen