Питання на співбесіді: Сесії
Найпопулярніші питання з реальних Laravel/PHP співбесід для всіх рівнів
3 питання
Сесії зберігають стан користувача між запитами. Laravel дає єдиний API поверх різних драйверів (file, cookie, database, redis), що налаштовуються в config/session.php.
session(['cart_id' => 42]); // записати
$id = session('cart_id'); // прочитати
$request->session()->forget('cart_id'); // видалити
session()->flush(); // очистити все
Для продакшену з кількома серверами зазвичай обирають redis або database, щоб сесія була спільною між інстансами.
Flash Data - дані, що живуть у сесії лише до наступного запиту й потім автоматично видаляються. Класичне застосування - повідомлення про результат дії після редиректу.
return redirect('/dashboard')->with('status', 'Профіль оновлено!');
@if (session('status'))
<div class="alert">{{ session('status') }}</div>
@endif
Під капотом - session()->flash('key', $value). Метод reflash() продовжує життя flash-даних ще на один запит.
Драйвер задається в config/session.php. На одному сервері різниці майже немає, на кількох - вона вирішальна.
file - файли на диску сервера. За балансувальником користувач після кожного запиту може потрапити на інший сервер, де його сесії немає, тож його «розлогінює» через раз.
cookie - усе зберігається в самій куці, зашифрованій. Спільного сховища не треба, але обсяг обмежений ~4 КБ, і дані їздять у кожному запиті.
database - таблиця sessions, спільна для всіх серверів. Працює надійно, ціна - запит на кожен запит.
redis - спільне сховище в памʼяті. Стандартний вибір для кількох серверів: швидко й без навантаження на базу.
Що ще ламається на кількох серверах, крім драйвера:
APP_KEYмає бути однаковий на всіх серверах, інакше куки, зашифровані одним, не розшифрує інший.- Той самий Redis мають бачити всі вузли - окремі інстанси не допоможуть.
Дві деталі, що псують життя окремо від масштабування. Сесія блокується на час запиту, тож кілька паралельних AJAX-запитів шикуються в чергу - для читання це знімається ->block() або сесією без запису. І в API сесій зазвичай узагалі не має бути: токен не потребує стану на сервері, а SESSION_DRIVER для stateless-запитів - зайва робота.