@Narts

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

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

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


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

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

Какой способ более эффективный и ресурсосберегающий?
  • Вопрос задан
  • 587 просмотров
Решения вопроса 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
Либо в сессии, либо в подписаных куках(если данные публичны).
При большой нагрузке скорее всего придется масштабироваться горизонтально => для сессий надо использовать внешнее хранилище, например редис.
Плюс надо позаботиться об обновлении данных при обновлении сущностей.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы