Laravel Horizon für PHP: Komplette Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Laravel Horizon: Leistungsstarkes Redis-Queue-Monitoring und -Management in PHP

In der modernen PHP-Webentwicklung ist die asynchrone Verarbeitung von Aufgaben über Warteschlangen (Queues) zum De-facto-Standard geworden. Laravel bietet eine integrierte Queue-Unterstützung, aber sobald ein Projekt wächst, wird es schwierig, dutzende Worker zu verwalten, ihre Leistung zu überwachen und Probleme zu diagnostizieren. Hier kommt Laravel Horizon ins Spiel – ein leistungsstarkes Tool für das Monitoring und Management von Redis-Queues.

Horizon ist weit mehr als nur ein Dashboard. Es ist ein vollwertiges Queue-Management-System, das eine übersichtliche Weboberfläche bietet, um alle Aspekte der Queue-Arbeit zu verfolgen: Anzahl der verarbeiteten Jobs, Ausführungszeit, Fehleranzahl, Worker-Status und vieles mehr. Anders als beim Standard-Ansatz, bei dem Sie Worker manuell starten, verwaltet Horizon sie automatisch, verteilt die Last auf mehrere Prozesse und balanciert sie je nach aktueller Auslastung.

Der entscheidende Vorteil von Horizon ist die Integration mit Redis. Es nutzt Redis nicht nur als Queue-Treiber, sondern auch als Speicher für Metriken und Worker-Status. Das macht es unglaublich schnell und skalierbar. Sie können Horizon auf mehreren Servern ausführen, und es sammelt Daten von allen Workern in einem zentralen Dashboard. Das ist die ideale Lösung für Produktionsumgebungen, in denen jede Millisekunde zählt.

Installation

Die Installation von Horizon erfolgt über Composer, den Standard-Paketmanager für PHP. Stellen Sie sicher, dass Composer installiert ist und Ihr Projekt Laravel 5.5 oder höher verwendet.

composer require laravel/horizon

Nach der Installation des Pakets müssen Sie die Konfigurationsdateien und Assets veröffentlichen:

php artisan horizon:install

Dieser Befehl erstellt die Konfigurationsdatei config/horizon.php und registriert den Horizon-Service-Provider. Außerdem wird die Routen-Datei routes/horizon.php erstellt, falls Sie Laravel 8+ verwenden.

Fügen Sie als Nächstes den Provider in config/app.php hinzu (falls er nicht automatisch hinzugefügt wurde):

'providers' => [
    // Andere Provider...
    App\Providers\HorizonServiceProvider::class,
],

Danach müssen Sie die Migrationen ausführen, um die für Horizon benötigten Tabellen zu erstellen (obwohl die Hauptlogik Redis verwendet, werden einige Daten in der Datenbank gespeichert):

php artisan migrate

Schließlich müssen Sie Redis konfigurieren. Stellen Sie sicher, dass ein Redis-Server installiert und gestartet ist und dass in der .env-Datei die richtigen Verbindungsparameter angegeben sind:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Schnellstart: Ein minimales Arbeitsbeispiel

Nach der Installation und Konfiguration können Sie Horizon sofort starten und in Aktion sehen.

Schritt 1: Horizon starten

Führen Sie im Terminal folgenden Befehl aus:

php artisan horizon

Sie werden sehen, wie Horizon mehrere Worker-Prozesse startet. Standardmäßig werden drei Prozesse zur Verarbeitung von Aufgaben aus der default-Queue erstellt.

Schritt 2: Einen Queue-Job erstellen

Erstellen wir einen einfachen Job, der einen längeren Vorgang simuliert:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcastId;

    public function __construct($podcastId)
    {
        $this->podcastId = $podcastId;
    }

    public function handle()
    {
        // Simuliere eine zeitaufwändige Aufgabe
        sleep(5);
        \Log::info("Podcast {$this->podcastId} wurde verarbeitet.");
    }
}

Schritt 3: Job in die Queue einreihen

Sie können den Job nun von überall in Ihrer Anwendung aus in die Queue einreihen, zum Beispiel in einem Controller:

ProcessPodcast::dispatch(42);

Schritt 4: Das Horizon-Dashboard aufrufen

Öffnen Sie Ihren Browser und navigieren Sie zu http://ihre-app.test/horizon. Sie sehen das Horizon-Dashboard mit Echtzeit-Statistiken. Nachdem Sie den Job ausgelöst haben, sehen Sie, wie er verarbeitet wird, und können Metriken wie Ausführungszeit und Status einsehen.

Wichtige Methoden und Konfiguration

Horizon bietet eine Reihe von Methoden und Konfigurationsmöglichkeiten, um das Queue-Management an Ihre Bedürfnisse anzupassen. Hier sind die wichtigsten:

1. Umgebungen und Worker-Gruppen definieren

In der Datei config/horizon.php können Sie verschiedene Umgebungen (z.B. local, production) mit unterschiedlichen Worker-Konfigurationen definieren:

'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default', 'high', 'low'],
            'balance' => 'auto',
            'processes' => 10,
            'tries' => 3,
        ],
    ],
    'local' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default'],
            'balance' => 'simple',
            'processes' => 3,
            'tries' => 1,
        ],
    ],
],

2. Wartezeiten und Wiederholungsversuche konfigurieren

Sie können die maximale Anzahl an Wiederholungsversuchen (tries) und die Verzögerung zwischen den Versuchen (retryAfter) für jeden Supervisor festlegen.

3. Benachrichtigungen einrichten

Horizon kann Sie benachrichtigen, wenn ein Job fehlschlägt oder wenn die Wartezeit in einer Queue zu lang wird. Konfigurieren Sie dies in der horizon.php-Datei:

'waits' => [
    'redis:default' => 60,
],

'notifications' => [
    'enabled' => true,
    'channels' => ['mail', 'slack'],
],

Fazit

Laravel Horizon ist ein unverzichtbares Werkzeug für jedes Laravel-Projekt, das Redis für die Queue-Verarbeitung nutzt. Es vereinfacht das Management von Workern, bietet tiefe Einblicke in die Leistung Ihrer Queues und hilft Ihnen, Engpässe frühzeitig zu erkennen. Mit der einfachen Installation und der intuitiven Benutzeroberfläche können Sie Ihre asynchrone Job-Verarbeitung auf das nächste Level heben.

Empfehlungen