REST працює за схемою «запит - відповідь»: клієнт питає, сервер відповідає. Коли клієнту потрібно дізнаватися про зміни одразу, без постійного опитування, використовують постійне з'єднання.
Варіанти:
- опитування (polling) - запит раз на N секунд. Найпростіше, але створює багато порожніх запитів і затримку до N секунд;
- Server-Sent Events (SSE) - однобічний потік від сервера до клієнта через звичайне HTTP-з'єднання. Автоматичне перепідключення вбудоване в браузер. Добре для сповіщень, прогресу, стрічок, відповідей LLM;
- WebSocket - двобічний канал. Потрібен, коли й клієнт часто надсилає дані: чат, спільне редагування, присутність користувачів онлайн.
Laravel Reverb - власний WebSocket-сервер Laravel, сумісний із протоколом Pusher. Застосунок транслює події, а клієнти підписуються через Laravel Echo:
php artisan install:broadcasting --reverb
php artisan reverb:start
class OrderShipped implements ShouldBroadcast
{
public function __construct(public Order $order) {}
public function broadcastOn(): array
{
return [new PrivateChannel("orders.{$this->order->user_id}")];
}
}
Echo.private(`orders.${userId}`).listen('OrderShipped', (event) => {
updateStatus(event.order);
});
Приватні канали авторизуються в routes/channels.php - Reverb пускає лише тих, кому дозволено слухати канал.
Що враховувати в продакшені:
- Reverb - окремий довгоживучий процес (Supervisor, контейнер), за зворотним проксі з підтримкою WebSocket;
- ліміт відкритих файлів ОС - кожне з'єднання займає дескриптор;
- горизонтальне масштабування - кілька серверів Reverb обмінюються повідомленнями через Redis (
REVERB_SCALING_ENABLED); - події через чергу: трансляція з
ShouldBroadcastіде через чергу, тож без воркера повідомлення не надходять.
SSE в Laravel - response()->eventStream() у звичайному маршруті: без окремого сервера, але кожен відкритий потік тримає процес PHP.