За последние 24 часа нас посетили 17629 программистов и 1613 роботов. Сейчас ищут 2002 программиста ...

Как управлять сессиями пользователей на сервере?

Тема в разделе "PHP для новичков", создана пользователем rambap, 31 май 2017.

  1. rambap

    rambap Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    25
    Симпатии:
    0
    На сайте регистрируются пользователи, заходят в пользовательскую часть сайта используя логин-пароль. В БД MySQL sessions пишутся активные сессии этих пользователей, чтобы подсчитывать сколько пользователей сейчас онлайн и других подобных целей. Как получить доступ и управлять пользовательскими сессиями в PHP 5.6 ? Вот например я хочу получить доступ к данным сессии 7dkb0qepg9v84dg9nm5gn0c4t0, id которой хранится в моей таблице как это сделать? И как держать актуальными данные в таблице sessions, чтобы она содержала только сессии пользователей, которые в данный момент на сайте? Может перебирать все сессии в цикле foreach, а в сессию каждому пользователю писать

    Код (Text):
    1. $_SESSION['last_access'] = time();
    И затем

    Код (Text):
    1. foreach ($sessions_from_mysql_table as $session){ if( (time() - $_SESSION['last_access']) > 120 ) // Delete session from mysql tbl }
    Как лучше сделать, подскажите. Сайт достаточно большой, поэтому хотелось бы чтобы код давал оптимальную нагрузку на сервер.
    Может есть какой-нибудь хороший готовый класс для этих целей? PHP на сервере 5.6.30
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Как всё запутанно в твоих знаниях...
    Если у тебя есть список сессий в базе - удаление можно раз в минуту по крону делать одним простым запросом.
    Файлы сессии самой пхп машины это просто файлы и тебе совершенно не нужно в них влезать.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.798
    Симпатии:
    1.331
    Адрес:
    Лень
    DELETE FROM `table` WHERE `time` < ...
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Перед махинациями важно понимать, что СУБД не используется в качестве базового хранилища сессий.
    @Ganzal упомянул о файлах сессий, соответственно, нужно помнить (и проверить), что можно заставить хранить сессии помимо стандартного метода, например в редисе, мемкеше, той же реляционной СУБД и т.д. В определенных проектах и задачах первые 2 варианта вполне применимы. Хранение сессий в бд это вынужденный шаг которого можно избежать и нужно избежать. СУБД предназначена совершенно для других целей.

    В случае если (у тс скорее всего это так) в базу пишутся ID сессий лишь для внутренних нужд и не являются их основным хранилищем, реализовывать на основе их записи (и перезаписи) отслеживания онлайн-пользователей можно как угодно: вы ограничены только архитектурой приложения и структурой самой базы данных.

    Структуру данных вы не предоставили. Тем не менее, в простой реализации вашей задачи (её решении на основе реляционной СУБД) используется обычно дополнительная "таблица" онлайн-пользователей (в "нагруженных проектах"). Туда пишется ID сессии и, что особенно важно, сохраняется время апдейта или создания записи.
    Соответственно, вы просто регулярно трете записи старше скажем 5-ти минут и совершаете их перезапись в случае активности пользователя (открытие новой страницы и т.п.). Таким образом вы получаете актуальное количество пользователей на сайте.
     
    #4 Zuldek, 31 май 2017
    Последнее редактирование: 1 июн 2017
    mahmuzar нравится это.