@Narts

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

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

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


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

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

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект