Einfache Automatisierungen mit Cronjobs und Laravel

Definiere deine Jobs im Laravel-Scheduler und lasse einen System-Cron jede Minute php artisan schedule:run ausführen. Den Rest übernimmt Laravel – inkl. Taktung, Überlappungsschutz und Cluster-Locking.

Warum Cron + Laravel-Scheduler?

  • Ein Cron-Eintrag für alles: Statt zig einzelne Cronjobs zu pflegen, erledigt Laravel die Aufgaben zentral. Du brauchst auf dem Server nur einen Cron, der minütlich den Scheduler triggert.
  • Mehr Komfort: Lesbare Intervalle (->dailyAt('06:30'), ->weeklyOn(1, '08:00')) oder frei per ->cron('...').

Schritt 1: Ein kleines Ziel definieren

Beispiel: Täglicher Report als E-Mail oder Logeintrag.

php artisan make:command SendDailyReport

app/Console/Commands/SendDailyReport.php:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class SendDailyReport extends Command
{
    protected $signature = 'report:send';
    protected $description = 'Sendet den täglichen Report';

    public function handle(): int
    {
        // Hier deine Business-Logik (Mail, Export, API, ...)
        Log::info('Daily report sent at '.now()->toDateTimeString());
        return self::SUCCESS;
    }
}

Schritt 2: Im Laravel-Scheduler einplanen

Ab Laravel 11/12 wird Scheduling typischerweise in routes/console.php definiert (ältere Projekte nutzen oft app/Console/Kernel.php). Beide Wege funktionieren. laravel.com

routes/console.php:

<?php

use Illuminate\Support\Facades\Schedule;

// Täglich um 06:30 Uhr (Serverzeit)
Schedule::command('report:send')->dailyAt('06:30');

Pro-Tipps:

  • ->timezone('Europe/Berlin') setzen, wenn die Ausführungszeit an die lokale Zeit gekoppelt sein soll (z. B. operatives Reporting).
  • ->runInBackground() für Prozesse, die Output nicht in die Konsole schreiben müssen.

Schritt 3: System-Cron einmalig einrichten

Ubuntu/Debian (als Root):

sudo crontab -e

Dann einen Eintrag hinzufügen (Pfad anpassen!):

* * * * * cd /var/www/app && php artisan schedule:run

Praxisbeispiele (Copy-&-Paste)

1) Wöchentlich montags 08:00 Uhr:

Schedule::command('report:send')->weeklyOn(1, '08:00');

2) Alle 15 Minuten, nur in Production:

Schedule::command('invoices:sync')
    ->everyFifteenMinutes()
    ->when(fn() => app()->isProduction());

3) Eigene Shell-Skripte via Scheduler:

Schedule::exec('/usr/local/bin/backup.sh')->dailyAt('02:30');

4) Mit fester Zeitzone (Ausführung 06:30 Berlin-Zeit):

Schedule::command('report:send')
    ->dailyAt('06:30')
    ->timezone('Europe/Berlin');

Cron-Cheatsheet (mini)

  • * * * * * = minütlich
  • 0 * * * * = stündlich zur vollen Stunde
  • 0 6 * * * = täglich 06:00
  • 0 8 * * 1 = montags 08:00
  • */5 * * * * = alle 5 Minuten

Fazit

Mit einem Cron-Eintrag und dem Laravel-Scheduler automatisierst du Reports, Syncs, Aufräum-Jobs & Co. zuverlässig – lesbar im Code und problemlos clusterfähig. Wenn du’s möglichst schlank halten willst: einen Cron pro Projekt, der minütlich schedule:run ausführt – fertig.

Wenn du Fragen zur Einrichtung des Laravel-Schedulers hast oder Unterstützung bei der Umsetzung deiner Automatisierungen mit Cronjobs brauchst, schau gerne auf unserer Website vorbei oder nimm direkt Kontakt mit uns auf – wir helfen dir dabei, deine Abläufe zuverlässig, skalierbar und übersichtlich zu gestalten. Bei weiteren programmiertechnischen Fragen wirf auch einen Blick auf unsere anderen Artikel – vielleicht ist genau das Thema dabei, das dich bei deinem nächsten Projekt weiterbringt.