wire:poll періодично надсилає запит до компонента й оновлює його - найпростіший спосіб показувати свіжі дані без WebSocket.
<div wire:poll>
Нових замовлень: {{ $this->newOrdersCount }}
</div>
<div wire:poll.15s="refreshStatus">
Статус імпорту: {{ $status }}
</div>
За замовчуванням - кожні 2,5 секунди з повторним рендером компонента; з назвою методу - викликається цей метод.
Чому це дорого: тисяча відкритих вкладок з інтервалом 2,5 с - 400 запитів на секунду на сервер, кожен з гідрацією компонента, запитами до бази й рендером. Для PHP-FPM це сотні зайнятих процесів лише на опитування.
Як зменшити навантаження:
- довший інтервал. Найефективніший і найпростіший крок:
.10s,.1mзамість типових 2,5 с; .visible- опитувати лише тоді, коли елемент видно на екрані. Блок унизу довгої сторінки не опитується, поки до нього не прокрутять;- фонові вкладки Livewire пригальмовує автоматично - на 95%. Модифікатор
.keep-aliveвимикає це, і без справжньої потреби його не варто ставити; - легкий метод опитування: перевірити дешеву ознаку змін (кількість,
max(updated_at)) і не перебудовувати важкі дані, якщо нічого не змінилося; - острівець (
@island) з опитуванням - оновлюється лише ця частина компонента, а не весь шаблон; #[Isolate]- щоб повільне опитування одного компонента не затримувало запити інших.
Livewire 4: опитування більше не блокує інші дії - клік користувача не чекає на запит опитування в черзі.
Коли опитування - неправильний інструмент:
- оновлення потрібні миттєво (чат, спільне редагування) - WebSocket (Laravel Reverb + Echo), і Livewire слухає події трансляції через
#[On('echo:...')]; - оновлення рідкісні, а відвідувачів багато - теж краще події, ніж тисячі порожніх запитів;
- зміна станеться один раз (завершення імпорту) - опитування з зупинкою: перестаньте рендерити
wire:poll, коли статус фінальний.