Обидві технології дають змогу серверу надсилати дані в браузер без запиту від клієнта. Різниця - у напрямку, протоколі й складності.
Server-Sent Events (SSE) - однобічний потік від сервера до клієнта через звичайне HTTP-з'єднання:
const source = new EventSource('/orders/42/status');
source.addEventListener('status', (event) => {
const { status } = JSON.parse(event.data);
updateBadge(status);
});
source.onerror = () => { /* браузер сам перепідключиться */ };
Сервер відповідає з Content-Type: text/event-stream і пише рядки:
event: status
id: 17
data: {"status":"shipped"}
- автоматичне перепідключення вбудоване; при перепідключенні браузер надсилає
Last-Event-ID, і сервер може дослати пропущене; - працює через звичайний HTTP: проксі, балансувальники, автентифікація cookies - як у будь-якого запиту;
- лише текст, лише від сервера;
- на HTTP/1.1 браузер обмежує ~6 з'єднань на домен - кілька вкладок з SSE можуть їх вичерпати. На HTTP/2 і HTTP/3 обмеження немає.
WebSocket - двобічне постійне з'єднання з власним протоколом:
const socket = new WebSocket('wss://example.com/ws');
socket.onmessage = (event) => render(JSON.parse(event.data));
socket.send(JSON.stringify({ type: 'typing', chat: 7 }));
- обидві сторони надсилають повідомлення будь-коли, з мінімальними накладними витратами;
- текст і бінарні дані;
- перепідключення, «серцебиття», підписки на канали - пишете самі або беруть бібліотеку;
- потрібен сервер, що тримає тисячі постійних з'єднань, і налаштовані проксі.
Коли що:
| Задача | Вибір |
|---|---|
| статус замовлення, сповіщення, прогрес задачі, стрічка подій | SSE |
| потокова відповідь LLM («друкується» по словах) | SSE / потоковий fetch |
| чат, спільне редагування, ігри, присутність користувачів | WebSocket |
| оновлення раз на хвилину | звичайне опитування - найпростіше |
У Laravel-екосистемі:
- WebSocket - Laravel Reverb (свій сервер) чи Pusher, на клієнті Laravel Echo; трансляція подій через
ShouldBroadcast; - SSE -
response()->eventStream()у контролері; Livewire маєwire:streamдля потокового оновлення частини компонента.
Головна перевага SSE - простота: не потрібен окремий сервер і протокол, це звичайний маршрут Laravel. Але кожен відкритий потік тримає процес PHP-FPM зайнятим - під багато одночасних клієнтів потрібні Octane чи окремий сервіс.