PHP - как определить дату и время окончания сессии? - PullRequest
1 голос
/ 25 января 2011

Usercase: мне нужно отслеживать продолжительность пользователя на сайте.Это рассчитывается как (конечная дата-время - начальная дата-время).Это прекрасно работает, если пользователь нажимает кнопку выхода.затем система может записать дату и время окончания.Но у меня проблема в крайних случаях: сеанс пользователя заканчивается из-за - потери интернет-соединения на стороне пользователя, закрытия браузера, сбоя системы и т. Д. В этих случаях как система узнает дату и время окончания, чтобы я мог рассчитать продолжительность.Нужно, чтобы конечное время было рассчитано как можно ближе к реальному времени.Если это невозможно, то с точностью до 5 минут вполне подойдет.

Один из возможных способов, который я вижу, - это продолжать пинговать клиентскую систему и проверять, активна она или нет.Но я не хочу делать это, поскольку это добавляет нежелательную пропускную способность.Так есть ли другой способ получить эту информацию для крайних случаев?

Ответы [ 3 ]

3 голосов
/ 25 января 2011

Почему бы просто не проверить время последнего просмотра страницы?

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

2 голосов
/ 25 января 2011

На практике система не может знать время окончания, потому что HTTP является протоколом без сохранения состояния. Сеансы PHP (и аналогичные функции в других языках веб-сценариев) - это хак для реализации чего-то, что выглядит с состоянием, но такие хаки не могут полностью преодолеть природу HTTP без состояния. Например, как вы обнаружили, у сервера нет возможности узнать, что пользователь вышел из системы, если он не прошел процесс выхода из системы.

Вы можете использовать AJAX для проверки связи с пользователем, но, как вы сказали, это использует пропускную способность. Он также не сможет функционировать, если у пользователя отключена поддержка javascript.

Единственный разумный вариант - регистрировать временную метку для пользователя каждый раз, когда он попадает на страницу в вашей системе, и смотреть, сколько времени прошло с момента обновления временной метки. Если он превышает разумный предел, скажем, 20 минут, вы можете сделать предположение, что пользователь больше не находится на вашем сайте. Опять же, это не совсем идеально, так как пользователь, возможно, только что вышел из-за дыма или чего-то еще, но, поскольку HTTP не имеет состояния, ни одно решение, которое вы можете реализовать, не является полностью идеальным.

0 голосов
/ 25 января 2011

Отслеживание времени последней активности пользовательского сеанса - в основном при каждом запросе клиента вы обновляете свою запись сеанса с указанием времени запроса. Если вы также сохранили время входа в систему, вы всегда можете рассчитать продолжительность сеанса, независимо от того, активен он, неактивен или пользователь вышел из системы. Я также установил флаг «logged_out» в моих таблицах сеансов, который устанавливается, если пользователь активно выходит из системы.

Вот определение моей сеансовой таблицы:

CREATE TABLE IF NOT EXISTS `session` (
  `id` int(11) NOT NULL auto_increment,
  `php_session_id` varchar(100) NOT NULL default '',
  `ip_addr` varchar(100) NOT NULL default '',
  `login_time` datetime NOT NULL ,
  `activity_time` datetime NOT NULL ,
  `user_id` int(11) NOT NULL default '0',
  `logged_out` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `session_id` (`php_session_id`,`ip_addr`),
  KEY `user` (`user_id`,`logged_out`)
) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...