Как я могу узнать, активен ли сеанс или нет? - PullRequest
1 голос
/ 07 июля 2011

Я храню идентификаторы сессий в таблице базы данных.Я хочу запустить скрипт, который читает из таблицы каждый идентификатор сеанса и проверяет, активен этот сеанс или нет.

Я знаю, что информация о сеансе хранится в каталоге (/tmp по умолчанию) и удаляется изтам когда сессия закрыта.Но если пользователь закрывает свой браузер, не отключаясь от сеанса, файл сеанса по-прежнему находится в каталоге /tmp.

Как узнать, активен ли сеанс или нет?

Iискал функции сеанса и не нашел ничего, что могло бы помочь.

Ответы [ 4 ]

6 голосов
/ 07 июля 2011

Вообще говоря, единственный способ состоит в том, чтобы иметь «последнюю использованную» дату / время, которую вы обновляете при каждой ссылке на сеанс, и отменять / деактивировать сеансы после того, как они не использовались в течение определенного периода времени.

Невозможно определить, будут ли ссылки на сеанс дальше, поскольку они не остаются открытыми между запросами, просто ссылаются при необходимости ... и необходимость диктуется постоянно изменчивым клиентом.

Если ваши сеансы основаны на файлах, как это звучит, вы можете использовать дату последнего доступа отдельных файлов, возможно, избавите себя от некоторых проблем.

1 голос
/ 07 июля 2011

Если вы ведете сеансы в базе данных.Добавьте последнюю доступную или измененную временную метку к таблице базы данных.Я поместил в свои процедуры код, который извлекает или хранит информацию о сеансах, которые УДАЛЕНО ИЗ сеансов, ГДЕ изменено более часа назад.Как долго вы хотите, чтобы ваша сессия была.При каждом вызове вы можете обновить эту метку времени.Кажется, это может привести к снижению производительности, но я довольно часто использовал этот шаблон / процесс.Я почти всегда использую базу данных для хранения информации о сеансе.Вы должны исследовать session_set_save_handler () .Я могу попытаться собрать часть своего собственного кода из предыдущего проекта, где я использовал это, но я уверен, что чтение руководства по этой реализации и поиск в Google поможет вам немало.

0 голосов
/ 07 июля 2011

Нет такой функции.Сам PHP несколько использует хак, чтобы определить, когда сеанс истек, в файле конфигурации php.ini есть несколько опций.

Короче говоря, каждый раз, когда начинается сеанс, появляется gc_probability / gc_divisor Возможно, php начнет сборку ожидающих данных.Сеанс, к которому обращаются до gc_maxlifetime секунд, считается истекшим, и PHP удаляет их.

Вы можете включить это поведение, настроив параметры envolved или подражая этому поведению аналогичным способом.

Для справки:

0 голосов
/ 07 июля 2011

Почему вы заботитесь об этих уже устаревших сессиях?Они все равно будут удалены из временной папки через какое-то случайное время.

Вам следует проверить время последнего доступа в вашей базе данных и, если оно больше, чем какое-то заранее заданное время ожидания, пометить его как мертвое.о вашей производительности тоже.Это лучший способ хранить данные сеанса в memcache или в чем-то подобном - просто храните их в памяти, а не в БД.Подробнее об этом можно прочитать здесь: http://memcached.org/

Сохранить данные сеанса в memcached очень просто: http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...