[Решено] Множатся сессии в БД

Возникла следующая проблема: в таблице prefix_session очень много наплодилось сессий для каждого пользователя при том отличается только session_date_create и иногда IP сессии. При том для этих всех сессий пользователя session_date_last одинаковое, а это создаёт проблему для раздела /people/online, поскольку один пользователь может занимать там аж 25 первых строчок… и таким образом только он будет показан в списке.
В чём может быть проблема?

UPD. Решение 1.
Пока решил следующим образом:
В файле User.mapper.php добавил, то что отмечено:
public function UpdateSession(ModuleUser_EntitySession $oSession) {
		$sql = "UPDATE ".Config::Get('db.table.session')."
			SET
				session_ip_last = ? ,
				session_date_last = ?
			WHERE user_id = ? 
                        AND session_key = ? -- тут
		";
		return $this->oDb->query($sql,$oSession->getIpLast(), $oSession->getDateLast(),
                        $oSession->getUserId(),
                        $oSession->getSessionKey() // и тут
                );
	}

Это позволяет обновлять только текущую сессию пользователя, таким образом остальные копии (дубликаты) сессии пользователя не будут обновлены и не будут мусорить. На только почистить старые сессии из БД.

UPD. Причина.
Причиной послужило то, что когда-то был включён плагин «Remember me», который преобразовывает таблицу сессий. Но после отключения он должен всё вернуть на место, чего по какой-то причине не произошло (из-за неправильного отключения плагина: из файла plugins.dat; или из-за неисправности кода плагина; не могу быть уверен в правильном варианте).
Спасибо, vdenu .

Решение 2 (правильное).
Сделать поле user_id уникальным. Перед этим может понадобится очистить таблицу.

В самом плагине есть такой запрос:
TRUNCATE TABLE `prefix_session`; ALTER TABLE `prefix_session` DROP INDEX `user_id` , ADD UNIQUE `user_id` ( `user_id` );

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

avatar
а у вас никакие плагины мультилогинов не стоят?
avatar
плагин для быстрого переключения между пользователями? или что?
avatar
нет, были плагины которые позволяли сохранять авторизацию между разными устройствами. они могут быть виновниками торжества
avatar
сейчас посмотрю, как раз сервер упал)
хотя, я не вижу в стандартном механизме ЛС запроса удаления старой сессии, только обновление по ИД юзера и добавление новой сессии
avatar
Не вижу тут такого:
autoopenid
ajaxload
attachtopics
autoconnect
autocut
bestsmiles
blocksmaster
blocktop
configengine
drafts
feedbacks
geopost
greeting
lastguests
lssettings
mailing
mainpreview
newpublishfrom
newsocialcomments
niceurl
opinion
page
readbeforecomment
searchautocompleter
seo
seopremium
similar
simplerating
simplesearch
sisyphus
socialcounters
tagslikefull
takenews
topicup
travelcard
trickytitle
viewcount
tantispam
timereading
stopwords
blockcreatedtopics
avatar
Offtop: насколько понимаю, если стоит simplesearch, то tagslikifull не нужен
avatar
Если вы хоть раз ставили плагин «Remember me» (посмотреть ли, ещё для чего), то он преобразует таблицы и нужно их потом править вручную.
avatar
Да, вы правы, видимо был когда-то включён этот плагин, только он должен переобразовать таблицы назад (есть такое у него в коде), но видимо или оно не сработало или на сайте не правильно выключали плагин (напрямую из файла plagins.dat).
Спасибо.
avatar
У автора был топик про этот плагин и там в комментариях он давал скрипт для SQL, который всё чинил.
avatar
вот об этом выше я и говорил.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.