Регистрация действий: как записывать время с помощью приложения PHP?

Я работаю с некоторым существующим кодом PHP/MySQL. Я регистрирую/отслеживаю определенные действия в базе данных MySQL. Некоторые точки доступа регистрируются. Подсчитывается количество входов пользователя в систему. Но мне нужно также регистрировать количество времени, в течение которого пользователь находится в системе, а также время, в течение которого пользователь находится в определенном разделе веб-сайта.

Поскольку PHP по большей части является средой без сохранения состояния, как лучше всего записать конечную точку (и); или когда пользователь выходит из системы?

Примечание. Я не могу заставить пользователя выйти из системы, так как браузер можно просто закрыть. Может быть, я мог бы просто поставить таймер AJAX, который будет считать минуты? Если да, следует ли рассматривать действия и время входа в систему как разные таблицы информации (MySQL)?

Изменить: я забыл упомянуть, что у нас есть jQuery.


person jjwdesign    schedule 10.11.2011    source источник


Ответы (3)


Как вы сказали, вы не можете заставить пользователя выйти из системы, и вы не можете точно знать, смотрит ли он на вашу страницу или играет в пинбол.

Решением будет запрос AJAX каждые, скажем, 5 минут, чтобы сообщить вашему приложению, что пользователь активен. К сожалению, если ваш пользователь заблокировал свой экран и пошел играть в пинбол, вы все равно не знаете точно, что он делает. Кроме того, выполнение запросов AJAX с такими интервалами увеличит нагрузку на сервер, особенно в многопользовательской среде.

На мой взгляд, лучшее решение — просто сохранить start_time пользователя (когда он входит в систему), а затем обновлять end_time при каждом его действии и с тайм-аутом сеанса.

Например:

  • Я вхожу в 5:00. Обновите start_time до 5:00.
  • Я просматриваю foo.php в 5:01. Обновите end_time до 5:01.
  • Я просматриваю bar.php в 5:03. Обновите end_time до 5:03.
  • Я иду пить кофе в 5:05.
  • Я возвращаюсь в 5:15, и моя сессия истекла, мне нужно повторно войти в систему.

Итак, вы знаете, что я потратил примерно 3 минуты на ваше приложение, так как последнее действие, которое я сделал, было в 5:03 (5:03 - 5:00 = 3). Конечно, вы не можете точно знать, было ли это 3 или 5 минут. Но вы можете предположить, в любом случае, в большинстве случаев, что если я ничего не делаю с вашим приложением (т. е. не выполняю скрипт, не вызываю и т. д.), то я его не использую.

Очевидно, что если вы можете фиксировать события JavaScript, такие как закрытие окна, это еще лучше, или если я выйду вручную: вы обновите end_time соответствующим образом.

person netcoder    schedule 10.11.2011

Вам нужно зафиксировать два события.

  1. Событие onCLose() для страницы и подключить его к обратному вызову ajax в вашу систему ведения журнала.
  2. Событие onClick() для вашей кнопки выхода из системы и подключить ее к обработчику сохранения ajax.

Событие onClose позволит вам зафиксировать, когда вкладка/браузер закрыта, а событие onCLick очевидно.

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

person FlyingGuy    schedule 10.11.2011

Вы можете использовать дополнительный PHP-скрипт, который записывает последнее действие и вызывает его через ajax.

Вы можете использовать javascript, чтобы отслеживать, активен ли пользователь (передвигал мышь или нажимал клавишу за последние 5 минут и т. д.).

РЕДАКТИРОВАТЬ: Почти забыл важную часть: ваш java-скрипт должен сделать запрос ajax каждые X секунд. Таким образом, если в течение x+tollerance секунд запроса не было, вы можете считать сеанс мертвым.

person Oliver A.    schedule 10.11.2011