Entwicklung und Datenbanken

WebSockets in Laravel: Reverb, Pusher und Alternativen

Geprüft am 10 Min. Lesezeit laravel websockets broadcasting pusher

Mit dem Broadcasting von Laravel benachrichtigt der Server den Browser in dem Moment, in dem etwas passiert: eine Benachrichtigung, eine Chatnachricht, eine Bestellung, deren Status sich ändert. Im Browser hört Laravel Echo zu; dazwischen braucht es einen WebSocket-Server, der die Verbindung zu jedem Besucher offen hält. Dieser Server kann Reverb sein, wenn Sie ihn selbst hosten, oder ein mit dem Pusher-Protokoll kompatibler Dienst, den Laravel von Haus aus unterstützt.

Auf dem Hosting verwenden wir die zweite Option: Ihre Anwendung bleibt hier, und die Verbindungen der Browser übernimmt der externe Dienst.

Warum wir Reverb auf dem Hosting nicht anbieten

Reverb ist ein Server, der dauerhaft läuft und die Verbindungen der Browser auf einem eigenen Port entgegennimmt. Die dauerhaften Prozesse des Hostings sind für Queues und andere Hintergrundaufgaben gedacht, und Programme, die auf einem Port lauschen, unterstützen wir nicht. Deshalb bieten wir weder Reverb noch Soketi oder andere eigene WebSocket-Server an.

So funktioniert es mit einem externen Dienst

Laravel en el hosting  --HTTPS-->  servicio de WebSockets  <--WSS--  navegador con Echo

Wenn Ihre Anwendung ein Event auslöst, sendet PHP eine HTTPS-Anfrage an den Dienst. Der Dienst verteilt es an die mit dem Kanal verbundenen Browser. Die Browser verbinden sich direkt mit dem Dienst, nicht mit dem Hosting, und verbrauchen daher weder Prozesse noch Verbindungen Ihres Kontos.

Vergleich

Preise und Limits geprüft am 11. Oktober 2026. Sie ändern sich häufig: Bestätigen Sie sie vor der Entscheidung auf der Website des jeweiligen Dienstes.

Am stärksten ins Gewicht fällt die Zahl der gleichzeitigen Verbindungen: Jeder Tab oder Bildschirm mit offenem Echo belegt eine. Nachrichten werden pro Zustellung gezählt: Ein Event, das 150 Bildschirme empfangen, verbraucht 151 Nachrichten.

Ably (empfohlen)

  • Kostenlos: 200 gleichzeitige Verbindungen und 6 Millionen Nachrichten pro Monat.
  • Kostenpflichtig: ab 29 $/Monat zuzüglich Nutzung, mit bis zu 10.000 Verbindungen.
  • Europa: Daten nur in der EU zu speichern, ist eine Option des Enterprise-Tarifs.
  • In Laravel: in Laravel enthaltener Treiber ably oder der offizielle Broadcaster ably/laravel-broadcaster. Im Browser Echo mit dem Adapter für das Pusher-Protokoll.

Es ist der umfangreichste kostenlose Tarif eines ausgereiften Dienstes: Mit 200 Verbindungen passt zum Beispiel ein Betrieb mit gut hundert Bildschirmen hinein.

Pusher Channels

  • Kostenlos: 100 gleichzeitige Verbindungen und 200.000 Nachrichten pro Tag.
  • Kostenpflichtig: ab 49 $/Monat, mit 500 Verbindungen und 1 Million Nachrichten pro Tag.
  • Europa: Cluster eu, in Irland.
  • In Laravel: Treiber pusher, mit php artisan install:broadcasting --pusher.

Es ist der direkteste Weg, den auch die Laravel-Dokumentation verwendet, und er reicht, wenn Sie nicht mehr als 100 gleichzeitige Verbindungen haben.

Weitere Pusher-kompatible Optionen

PieSocket (kostenlos bis 200 Verbindungen) und Vask (ab 10 $/Monat für 500 Verbindungen) sprechen das Pusher-Protokoll und werden daher wie Pusher konfiguriert, nur mit anderem Host. Es sind jüngere Dienste, die nicht angeben, wo sie die Daten speichern: Testen Sie sie, bevor Sie sie in Produktion einsetzen.

Was Ihr Konto braucht

  • Ausgehende HTTPS-Anfragen aus PHP, die das Hosting erlaubt. Sie müssen weder Ports öffnen noch etwas auf dem Server installieren.
  • Node.js, um Echo mit Vite zu bauen, über den Paketmanager. Deploy+ installiert es, wenn Ihr Skript es verwendet.
  • Einen Queue-Worker, wenn Ihre Events ShouldBroadcast implementieren: Laravel sendet sie aus der Queue, und ohne laufenden Worker kommen sie verspätet oder gar nicht an. In Avanza, Max und Elastic legen Sie einen Queue-Worker unter dauerhafte Prozesse an. In Inicia und Webmaster implementieren Sie ShouldBroadcastNow: Das Event wird in derselben Anfrage ohne Queue gesendet, dafür wartet diese Anfrage auf die Antwort des Dienstes. Eine Queue, die der Scheduler jede Minute abarbeitet, taugt nicht für Echtzeit.

Für das Broadcasting brauchen Sie kein Redis.

Ably konfigurieren

  1. Legen Sie bei Ably ein Konto, eine Anwendung und einen API key an. Er hat die Form xxxx.yyyy:zzzz.

  2. Aktivieren Sie in den Einstellungen der Anwendung unter Protocol Adapter Settings die Kompatibilität mit dem Pusher-Protokoll: Echo verbindet sich über pusher-js mit Ably.

  3. In Ihrem Projekt, lokal:

    php artisan install:broadcasting --ably
    

    Wenn Sie es lieber von Hand machen, installiert composer require ably/ably-php das PHP-SDK.

  4. In der .env der Produktion:

    BROADCAST_CONNECTION=ably
    ABLY_KEY="xxxx.yyyy:zzzz"
    VITE_ABLY_PUBLIC_KEY="xxxx.yyyy"
    

    VITE_ABLY_PUBLIC_KEY ist nur der Teil des Schlüssels vor dem Doppelpunkt. Der vollständige Schlüssel darf in keiner VITE_-Variable stehen.

  5. Konfigurieren Sie Echo mit dem Pusher-Adapter von Ably:

    import Echo from 'laravel-echo';
    import Pusher from 'pusher-js';
    window.Pusher = Pusher;
    
    window.Echo = new Echo({
        broadcaster: 'pusher',
        key: import.meta.env.VITE_ABLY_PUBLIC_KEY,
        wsHost: 'main.pusher.ably.net',
        wsPort: 443,
        forceTLS: true,
        disableStats: true,
        enabledTransports: ['ws', 'wss'],
    });
    
  6. Deployen Sie und prüfen Sie die Events in der Konsole Ihrer Anwendung bei Ably.

Ably pflegt außerdem einen eigenen Broadcaster für Laravel, ably/laravel-broadcaster, mit plattformspezifischen Funktionen. Wenn Sie ihn verwenden, folgen Sie für den Browser-Teil seiner Dokumentation.

Pusher Channels konfigurieren

  1. Legen Sie bei Pusher ein Konto und eine Channels-Anwendung im Cluster eu an. Unter App Keys finden Sie app_id, key und secret.

  2. Installieren Sie in Ihrem Projekt lokal das Broadcasting:

    php artisan install:broadcasting --pusher
    

    Der Befehl fragt die Zugangsdaten ab, installiert das PHP-SDK (pusher/pusher-php-server), Laravel Echo und pusher-js, legt routes/channels.php an und konfiguriert Echo. Speichern Sie die Änderungen in Ihrem Repository.

  3. In der .env der Produktion (mit Deploy+ über das Menü des Repositorys, .env bearbeiten):

    BROADCAST_CONNECTION=pusher
    
    PUSHER_APP_ID="tu_app_id"
    PUSHER_APP_KEY="tu_key"
    PUSHER_APP_SECRET="tu_secret"
    PUSHER_HOST=
    PUSHER_PORT=443
    PUSHER_SCHEME="https"
    PUSHER_APP_CLUSTER="eu"
    
    VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
    VITE_PUSHER_HOST="${PUSHER_HOST}"
    VITE_PUSHER_PORT="${PUSHER_PORT}"
    VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
    VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
    

    Die VITE_-Variablen landen im öffentlichen JavaScript: Sie enthalten den key, der öffentlich ist, aber nie das secret.

  4. Prüfen Sie die Echo-Konfiguration, die der Installer angelegt hat. In der Grundform für Pusher sieht sie so aus:

    import Echo from 'laravel-echo';
    import Pusher from 'pusher-js';
    window.Pusher = Pusher;
    
    window.Echo = new Echo({
        broadcaster: 'pusher',
        key: import.meta.env.VITE_PUSHER_APP_KEY,
        cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
        forceTLS: true,
    });
    
  5. Deployen Sie. Die VITE_-Variablen werden beim Build mit npm run build gelesen: Wenn Sie sie danach ändern, deployen Sie erneut, damit das JavaScript sie übernimmt.

  6. Öffnen Sie die Website und die Debug Console Ihrer Anwendung bei Pusher: Dort sehen Sie jede Verbindung und jedes gesendete Event.

Für private oder Presence-Kanäle autorisieren Sie jeden Benutzer in routes/channels.php. Laravel registriert die Route /broadcasting/auth, über die Echo diese Autorisierung anfordert.

Ein Event auslösen

Ein Event, das aus der Queue gesendet wird:

namespace App\Events;

use App\Models\Pedido;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PedidoActualizado implements ShouldBroadcast
{
    public function __construct(public Pedido $pedido) {}

    public function broadcastOn(): array
    {
        return [new PrivateChannel('pedidos.'.$this->pedido->user_id)];
    }
}

Ohne laufenden Queue-Worker ersetzen Sie ShouldBroadcast durch ShouldBroadcastNow. Im Browser:

window.Echo.private(`pedidos.${userId}`)
    .listen('PedidoActualizado', (e) => console.log(e.pedido));

Wenn das Event nicht ankommt, prüfen Sie der Reihe nach: dass BROADCAST_CONNECTION der des Dienstes ist, dass die Konfiguration nicht mit alten Werten gecacht ist (php artisan config:cache), dass ein Worker die Queue verarbeitet, dass die Konsole des Dienstes das Event empfängt und dass sich der Browser mit dem richtigen key verbindet.

Wir helfen Ihnen beim Anbinden

Wenn Ihre Anwendung Reverb auf einem anderen Server verwendet hat, beschränkt sich die Umstellung meist auf die .env, die Echo-Konfiguration und ein Deployment. Wenn Sie Hilfe brauchen, schreiben Sie uns aus dem Kundenbereich.

Mehr zu Laravel auf dem Hosting unter Laravel installieren. Referenz: Broadcasting in Laravel.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.