Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як налаштувати драйвер сесій для продакшену: база чи Redis, очищення старих сесій і що не варто зберігати в сесії?

Драйвер database - за замовчуванням у нових застосунках:

  • таблиця sessions з user_id, IP і user agent - можна показати користувачу активні сесії й завершити їх;
  • не потрібна додаткова інфраструктура;
  • кожен запит пише в базу (оновлення last_activity), на навантаженому сайті це помітне навантаження;
  • очищення старих записів - через «лотерею»: 'lottery' => [2, 100] означає, що приблизно у 2 зі 100 запитів Laravel видаляє протерміновані сесії. На великій таблиці це раптово повільний запит у випадкового користувача.

Драйвер redis:

  • швидкий, не навантажує основну базу;
  • записи протерміновуються самим Redis через TTL - лотерея не потрібна (для драйверів на основі кешу очищення нічого не робить);
  • але немає зручного запиту «всі сесії користувача» - для такої функції доведеться зберігати зв'язок окремо;
  • налаштування Redis важливе: якщо в тому самому екземплярі кеш з політикою витіснення allkeys-lru, при нестачі пам'яті Redis видалятиме й сесії - користувачів почне розлогінювати. Сесії краще в окремій базі Redis чи екземплярі з noeviction.

Чого уникати:

  • file на кількох серверах - кожен сервер бачить лише свої сесії;
  • cookie для великих даних - ліміт розміру cookie близько 4 КБ і дані в кожному запиті;
  • array - лише для тестів.

Що не зберігати в сесії:

  • моделі й великі об'єкти - серіалізуються цілком, застарівають, роздувають кожен запит. Зберігайте ідентифікатори;
  • дані, що мають пережити вихід (кошик зареєстрованого користувача, налаштування) - у базі;
  • секрети й токени сторонніх сервісів без потреби: вміст сесії видно будь-кому з доступом до сховища (SESSION_ENCRYPT=true шифрує дані сесії);
  • дані, що змінюються паралельними запитами - без блокування вони перезаписують одне одного.

Ще кілька параметрів:

  • SESSION_LIFETIME - хвилини неактивності; для адмін-панелей коротше;
  • SESSION_CONNECTION - окреме з'єднання з базою чи Redis для сесій;
  • 'serialization' => 'json' у config/session.php замість PHP-серіалізації (за замовчуванням php) закриває клас атак через десеріалізацію, але вимагає зберігати в сесії лише прості значення.

Докладніше в документації: Налаштування сесій

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання