Skip to main content

Was ist Task-Scheduling

Traditionell mussten Sie für jede regelmäßig ausgeführte Aufgabe einen eigenen Cron-Eintrag anlegen. Dabei liegen die Zeitpläne außerhalb des Quellcodes, sind nicht versioniert, und für Änderungen ist stets ein SSH-Zugang nötig. Mit dem Laravel-Scheduler definieren Sie Zeitpläne fließend in der Anwendung. Auf dem Server genügt ein einziger Cron-Eintrag; die Definitionen versionieren Sie zusammen mit dem Code. Zeitpläne werden üblicherweise in routes/console.php definiert.
Mit dem Artisan-Befehl schedule:list sehen Sie definierte Tasks und deren nächste Ausführung.

Ausführungsablauf des Schedulers

Zeitpläne definieren

Zeitpläne stehen in routes/console.php. Alternativ nutzen Sie die Methode withSchedule in bootstrap/app.php.

Was Sie planen können

Artisan-Kommandos

Mit command planen Sie Artisan-Kommandos – als Kommandoname oder Klassenname.
Auch Closure-Kommandos lassen sich direkt nach der Definition planen.

Queue-Jobs

Mit job planen Sie Queue-Jobs direkt, ohne Closure.
Sie können Queue-Name und Verbindung angeben.

Shell-Kommandos

Mit exec führen Sie OS-Kommandos aus.

Closures

Mit call planen Sie beliebige PHP-Closures.
Auch Invokable-Objekte mit __invoke sind möglich.

Ausführungsfrequenz

Wichtige Methoden

Direkte Cron-Ausdrücke

Mit cron verwenden Sie beliebige Cron-Ausdrücke.

Kombinierte Bedingungen

Frequenz- und Wochentagsmethoden lassen sich kombinieren.

Zeitzone

Mit timezone legen Sie die Zeitzone pro Task fest.
Eine gemeinsame Zeitzone für alle Tasks konfigurieren Sie in config/app.php unter schedule_timezone.
In Zeitzonen mit Sommerzeit können Tasks bei der Umstellung doppelt oder gar nicht ausgeführt werden. Nach Möglichkeit UTC verwenden.

Bedingungen

when / skip

when führt aus, wenn die Closure true liefert; skip überspringt bei true.

environments

Mit environments grenzen Sie die Ausführung auf bestimmte Umgebungen ein.

Zeitfenster

between / unlessBetween beschränken das Zeitfenster.

Wochentagsbeschränkungen

Überlappungen verhindern

Standardmäßig startet die nächste Ausführung, auch wenn die vorherige noch läuft. Mit withoutOverlapping warten Sie, bis der vorherige Lauf beendet ist.
Die Lock-Dauer (in Minuten) ist konfigurierbar (Standard: 24 Stunden).
withoutOverlapping verwaltet den Lock über den Application-Cache. Bei stecken gebliebenen Tasks können Sie den Lock mit schedule:clear-cache freigeben.

Ausführung auf mehreren Servern

Läuft der Scheduler auf mehreren Servern, sorgt onOneServer dafür, dass ein Task nur auf einem Server ausgeführt wird.
Voraussetzung: Der Standard-Cache-Treiber ist database, memcached, dynamodb oder redis, und alle Server verwenden denselben Cache-Server.

Ablauf mit onOneServer()

Tasks gruppieren

Mit group wenden Sie dieselben Einstellungen auf mehrere Tasks an.

Hintergrundausführung

Standardmäßig werden Tasks mit derselben Startzeit sequenziell ausgeführt. Ein langlaufender Task verzögert die nachfolgenden. Mit runInBackground starten Sie sie parallel.
runInBackground funktioniert nur mit command und exec.

Wartungsmodus

Im Wartungsmodus werden Tasks nicht ausgeführt. Mit evenInMaintenanceMode erzwingen Sie die Ausführung trotzdem.

Ablauf im Wartungsmodus

Scheduler pausieren

Sie können den Scheduler ohne Codeänderung anhalten.
Sollen bestimmte Tasks auch bei Pause weiterlaufen (z. B. Health Checks oder System-Monitoring), verwenden Sie evenWhenPaused.

Ausgaben verarbeiten

In eine Datei schreiben

Mit sendOutputTo schreiben Sie die Ausgabe in eine Datei.
Mit appendOutputTo wird die Ausgabe angehängt.

Per E-Mail versenden

Mit emailOutputTo verschicken Sie die Ausgabe per Mail. Setzt eine Mail-Konfiguration voraus.
Nur bei Fehlern versenden: emailOutputOnFailure.

Task-Hooks

Mit before und after fügen Sie Code vor bzw. nach dem Task ein.
Erfolgs- und Fehler-Hooks: onSuccess und onFailure.

Deployment auf dem Server

1

Cron-Eintrag hinzufügen

Fügen Sie in der crontab eine einzige Zeile hinzu, um den Scheduler jede Minute laufen zu lassen.
Mit crontab -e bearbeiten Sie die crontab.
2

Scheduler-Betrieb prüfen

Listen Sie die Tasks und die nächsten Ausführungen auf.
Mit Laravel Cloud verwalten Sie Zeitpläne ganz ohne Cron-Konfiguration.

Lokale Entwicklung

Statt Cron nutzen Sie lokal schedule:work, um den Scheduler dauerhaft laufen zu lassen.
Der Befehl läuft im Vordergrund und ruft den Scheduler jede Minute auf. Beenden mit Strg + C.

Sub-Minuten-Zeitpläne (kürzer als eine Minute)

Cron ist auf eine Minute begrenzt; Laravel bietet aber sekündliche Zeitpläne.
Sind Sub-Minuten-Tasks definiert, läuft schedule:run bis zum Ende der Minute weiter und führt alle Sub-Minuten-Tasks aus.
Delegieren Sie Sub-Minuten-Tasks an Queue-Jobs oder Hintergrund-Kommandos. Ein langlaufender Task verzögert sonst die nachfolgenden Sub-Minuten-Läufe.
Um einen laufenden schedule:run während eines Deployments zu unterbrechen, fügen Sie dem Deploy-Skript Folgendes hinzu:

Wichtige Befehle

Zuletzt geändert am 13. Juli 2026