2017-05-31 6 views
0

Ich habe einen Zeitplanjob, der jedes Mal eine Funktion aufruft. Diese Funktion macht eine Menge Sache, die vielleicht eine Ausnahme auslöst oder mir einen Fehler gibt.Abrufen eines Zeitplanauftrags in Laravel

Dies geschieht in einer Schleife, wenn ein Fehler auftritt, funktioniert die Funktion nicht mehr und bleibt stecken, bis ich den Eintrag lösche, der den Fehler verursacht (oder den Fehler behebe).

Etwas wie folgt aus:

public function process_documents() 
{ 
$documents = document::where("processed", 0)->get(); 

foreach($documents as $document) 
{ 
$this->do_this($document); 
$this->do_that($document); 
$this->finish($document); 
} 

} 

Lösungen, die ich allerdings haben:

1- einen Befehl machen, die einen Befehl ausführt.

foreach($documents as $document) 
{ 
Artisan::call("document:process",$document->id); 
} 

2- try catch überall

Ich weiß, dass sie beide funktionieren würde, aber ich würde gerne wissen, ob es einen anderen Weg.

Antwort

1

Die beste Lösung wäre, herauszufinden, warum der Prozess abstürzt und dieses Problem löst. Sie könnten Code schreiben, der den Fehler behandelt, das Problem in der Datenbank speichert und das Dokument überspringt, bis das Problem behoben ist.

Ansonsten glaube ich, dass Ihre erste Lösung der beste Weg sein wird, die Verarbeitung der verschiedenen Dokumente zu trennen. Ihr Code wird auch viel sauberer sein.
Try-Fies würde nur Ihren Code verstopfen.

+0

Natürlich repariere ich es jedes Mal, aber ich möchte nicht um 04:00 Uhr babysitten, weil etwas unerwartet abgestürzt ist. Vor allem, wenn ich nicht der einzige bin, der im Projekt arbeitet. – prgrm

+0

Das ist ein guter Rat. Obwohl ich glaube, dass "try/catch" Blöcke ihren Zweck und Platz haben. @prgrm erwähnt auch die Funktion, die viel tut. Untersuchen Sie die Trennung von Bedenken und gliedern Sie sie in kleinere, besser handhabbare Funktionen auf. – fubar

+1

Ich stimme zu, dass ein Versuch/Catch, um das Problem pro Dokument zu finden, in Ordnung wäre. Aber so wie ich es verstand, wollte er versuchen, jede einzelne Funktion zu überlisten. – Jerodev

0

Der Nachteil der Verwendung von Befehlen in Befehlen besteht darin, dass Sie nicht viel davon erhalten. Sie könnten den Code nur innerhalb des ursprünglichen Befehls ausführen und Fehler auf diese Weise erfassen.

Eine alternative Lösung, die Sie implementieren können, besteht darin, den Code innerhalb der Schleife in einem separaten gegabelten Prozess auszuführen, z. B. mithilfe von symfony/process oder duncan3dc/fork-helper.

Nachdem wir beide mit Erfolg für einen ähnlichen Anwendungsfall implementiert haben, hängt es wirklich davon ab, was Ihre innere Logik tut. Wenn der Code gleichzeitig ausgeführt werden kann oder nicht, können Sie durch Forking den Hauptprozess am Leben erhalten.

Ein kleiner Hinweis, wenn Sie dies testen, stellen Sie sicher, db-Verbindungen usw. zu überprüfen. Diese gehen normalerweise während des Gabelns verloren.

Verwandte Themen