Я делаю модификации для сайта, основанного на участниках, владелец которого хочет иметь возможность отслеживать время, проведенное на сайте (вход / выход) для всех пользователей в базе данных БД. Войти легко; есть одна точка входа (форма входа в систему), и в результате логины могут быть добавлены в базу данных, как только они произойдут.
Выход из системы, однако, немного сложнее, поскольку, если пользователь не нажмет кнопку «Выйти», чтобы явно дать нам знать, что он уходит, решение становится более неприятным (и как часто пользователи действительно нажимают кнопку выхода?) , Одна из возможностей (только с точки зрения отслеживания общего времени на сайте) состоит в том, чтобы зарегистрировать каждую загрузку страницы в базе данных и связать ее с пользователем, который ее загрузил; проблема в том, что сайт является сайтом доставки видео на основе членства (а не тем, о чем вы думаете!), и их последним просмотром страницы, вероятно, будет двадцать или тридцать минутное видео. Нам также нужно зафиксировать время, проведенное на этой последней странице, а не только время, которое она была загружена.
Я подумал о двух возможных решениях, ни одно из которых не является настолько элегантным. Первым было бы перехватить все события 'unload' с помощью javascript и зарегистрировать вызов 'logout.php' (это предполагает, что XMLHttpRequest или что-то еще не исчезнет, как только страница будет выгружена); проблема заключается в том, что внутренние ссылки также регистрируются как события выгрузки, поэтому нажатие на любую ссылку приведет к выходу пользователя из системы (вы можете проверить флаг в обработчике 'unload' и установить для всех внутренних ссылок этот флаг - несложно сделать динамически, но немного клудги). Другой подход заключается в установке интервала для проверки связи с БД каждые 60 с или около того, что позволяет нам знать, что пользователь все еще находится на сайте, а затем выполняет некоторые математические операции при извлечении истории пользователя, чтобы выяснить общую продолжительность этого сеанса. ; это также кажется отчасти хакерским. Кроме того, ни одно из этих решений не работает для пользователей с отключенным JS.
Кажется, что эта проблема не так уж необычна, и должен быть лучший способ; Есть ли передовой подход к решению этой проблемы? Если нет, видите ли вы какой-либо способ улучшить одно из этих решений?