Задать вопрос
@Narts

Как лучше хранить информацию об авторизованном пользователе?

Всем привет! На сайте есть авторизация, и возник вопрос: как эффективнее хранить информацию об авторизованном пользователе?

Например, в шапке выводится логин, аватарка пользователя. Делается это через
$info = $this->controller->user->getProfileInfo(Session::getUserId());


, где в моделе осуществляется запрос в БД. И получается при каждом открытии новой страницы, осуществляется запрос к бд (минимум один). Предполагаемый онлайн будет около 1000 человек одновременно. Не упадет ли сайт?

Есть вариант при авторизации всю нужную инфу сохранять в сессии и потом выводить как $_SESSION['user_avatar'] и т.д.

Какой способ более эффективный и ресурсосберегающий?
  • Вопрос задан
  • 625 просмотров
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@dtBlack
1. Хранить в сессии обычно будет экономичней.
2. Сказать что то про нагрузку по вашим вводных ничего нельзя. Я тут поправил структуру кода и данных на одном из рабочих сайтов, а то на одной страничке со списком было 8000+ запросов, при каждом показе. После правки кода удалось сократить до 12 запросов. и при этом сайт заметно не тормозил, просто сервер мощный и кушал этот мусор довольно легко.
2.1 Сказать что то о нагрузке так же нельзя не зная тип сайта и интенсивность его использования, например на сайте онлайн библиотеки-читальни, в среднем, 1000 пользователей онлайн создаст намного меньше нагрузки, чем на сайте магазина, в котором будет постоянное шастанье по товарам.
3. Никогда не делайте так:
потом выводить как $_SESSION['user_avatar']


сделайте функцию обертку, например:
class Session {
    
    public static function getAvatar(){
        if (!isset($_SESSION['user_info']['user_avatar'])){
            $_SESSION['user_info'] = $this->controller->user->getProfileInfo(Session::getUserId());
        }
        return $_SESSION['user_info']['user_avatar'];
    }
}

И использовать уже Session::getAvatar().
Такой подход позволит вам более гибко управлять данными, например организовать устаревание информации о пользователе по таймеру и тп.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@fubaro
Либо в сессии, либо в подписаных куках(если данные публичны).
При большой нагрузке скорее всего придется масштабироваться горизонтально => для сессий надо использовать внешнее хранилище, например редис.
Плюс надо позаботиться об обновлении данных при обновлении сущностей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽