Laravel Reverb, взаимодействие через WebSockets

Laravel Reverb, взаимодействие через WebSockets

Реальный опыт: как я внедрил Laravel Reverb в свои проекты

Не так давно я столкнулся с задачей — нужно было добавить живой чат поддержки в SaaS-продукт клиента. До этого я использовал Pusher и стороннюю обёртку Laravel WebSockets, но постоянно упирался в лимиты бесплатных тарифов и странные баги с переподключением. Когда Laravel выпустил собственный сервер Reverb, я решил рискнуть и мигрировать на него. Спустя год эксплуатации в продакшене могу сказать честно: это лучшее, что случилось с real-time функциями в Laravel. Делюсь полным гайдом, который прошёл проверку боем — от установки до продакшн-настроек.

Почему Reverb, а не Pusher или Socket.io

Reverb — это нативный WebSocket-сервер, написанный на PHP командой Laravel. Он полностью совместим с протоколом Pusher, что означает: можно использовать привычный Laravel Echo без переписывания фронтенда. Главные плюсы, которые я оценил на практике:

  • Работает внутри вашей инфраструктуры, без внешних сервисов.
  • Поддерживает горизонтальное масштабирование через Redis.
  • Легко запускается и поддерживается через Supervisor или Horizon.
  • Никаких лимитов на количество сообщений.

Шаг 1. Установка

Начинаем с чистого проекта Laravel:

composer create-project laravel/laravel realtime-demo
cd realtime-demo
php artisan install:broadcasting

Команда install:broadcasting — это магия. Она автоматически:

  • устанавливает пакет laravel/reverb
  • публикует конфиг config/reverb.php и config/broadcasting.php
  • добавляет нужные переменные в .env
  • устанавливает laravel-echo и pusher-js через npm

После установки проверьте .env — там должны появиться такие строки:

BROADCAST_CONNECTION=reverb

REVERB_APP_ID=my-app-id
REVERB_APP_KEY=my-app-key
REVERB_APP_SECRET=my-app-secret
REVERB_HOST="localhost"
REVERB_PORT=8080
REVERB_SCHEME=http

VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="${REVERB_HOST}"
VITE_REVERB_PORT="${REVERB_PORT}"
VITE_REVERB_SCHEME="${REVERB_SCHEME}"

Запускаем сервер Reverb отдельной командой (в проде это делает Supervisor):

php artisan reverb:start

Если увидели Starting server on 0.0.0.0:8080 — всё работает.

Шаг 2. Живой чат — модели и миграции

Создаём таблицу сообщений, команда ниже создает модель и миграцию:

php artisan make:model Message -m

Миграция:

public function up(): void
{
    Schema::create('messages', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained();
        $table->foreignId('chat_id')->constrained();
        $table->text('body');
        $table->timestamps();
    });
}

Модель Message:

class Message extends Model
{
    protected $fillable = ['user_id', 'chat_id', 'body'];

    public function user(): BelongsTo
    {
        return