Уникальный ключ `user_id` в prefix_session

Сегодня случайно заметил существование двух строк с одинаковым `user_id` и разными `session_key` в prefix_session, после выхода они обе удалились и воссоздать ситуацию у меня больше не получилось...

Кто-нибудь, подскажите, пожалуйства, должен ли ключ `user_id` быть уникальным при «чистой установке»?

p.s. Ситуация возникла после перехода с LS. Изменить тип ключа для данного поля в InnoDB просто так не получилось из-за внешних связей. Пришлось экспортировать, удалять и воссоздавать таблицу prefix_session

8 комментариев

+2
Кто-нибудь, подскажите, пожалуйства, должен ли ключ `user_id` быть уникальным при «чистой установке»?
Нет, не должен. В таблице ?_session сохраняется история сессий пользователя. Много заходов одного юзера — много записей с одним user_id.

Число хранимых сессий одного юзера задается параметром конфига:
$config['module']['user']['max_session_history'] = 50;
Если 0, то хранятся все сессии.

Это позволяет, во-первых, заходить одному юзеру с разных устройств без разрыва «параллельной» авторизации. А, во-вторых, дает возможность просмотреть историю сессий пользователя (сразу оговорюсь, что пока такой «волшебной кнопки» нет — посмотреть историю сессий, но сама история есть, и поэтому добавить просмотр заходов — это дело техники)
0
Огромное спасибо за подробный ответ. Позвольте ещё один уточняющий вопрос: почему при преднамеренном выходе на одном из устройств удаляются все записи данного пользователя в ?_session
0
Сходу не готов ответить, надо смотреть, тестировать. В принципе, записи вообще не должны удаляться, должна только сессия закрываться. Но, возможно, имеет место баг.
0
Странно, у меня на сервере [после LS > Alto] при преднамеренном выходе из БД Alto [$_session] удаляются все записи сессий определённого пользователя…
0
А параметр $config['module']['user']['max_session_history'] в конфиге какой стоит?
0
По умолчанию — $config['module']['user']['max_session_history'] = 50;
Но вот ещё раз перепроверил, точно, — удаляются все записи!

При обновлении session_date_last [а это происходит при каждом запросе] обновляется только строка насущной для данного логина/устройства [это так и задумано?], но при выходе удаляются все записи сессий…

Такое чувство, что осуществляется очищающий запрос устаревших сессий [он вроде бы единственный удаляет строки из данной БД]:

В \classes\modules\user\mapper\User.mapper.class.php
DELETE FROM " . Config::Get('db.table.session') . "
      WHERE user_id=?d AND session_date_last<=?";

P.S. Нажал на редактирование своего комментария, исправил код, обновил его, потом ещё раз нажал на редактирование, но в этот раз решил предпросмотреть. Всё устроило и я его отправил — Ajax визуально добавил второй точно такой же комментарий под уже написанным [он пропал после перезагрузки страницы].
Отредактирован:
0
Попробовал удалить это «очищающий запрос». Но, ничего не изменилось:
Вошёл в Альто. Строка появилась. Вышел. Строка исчезла.
0
Это изменение ключа `user_id` в таблице ?_session является достояние именно Alto [в LS ключ уникален]?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.