Как я могу отслеживать сетевые входы и выходы? - PullRequest
2 голосов
/ 02 декабря 2008

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

Выход из системы, однако, немного сложнее, поскольку, если пользователь не нажмет кнопку «Выйти», чтобы явно дать нам знать, что он уходит, решение становится более неприятным (и как часто пользователи действительно нажимают кнопку выхода?) , Одна из возможностей (только с точки зрения отслеживания общего времени на сайте) состоит в том, чтобы зарегистрировать каждую загрузку страницы в базе данных и связать ее с пользователем, который ее загрузил; проблема в том, что сайт является сайтом доставки видео на основе членства (а не тем, о чем вы думаете!), и их последним просмотром страницы, вероятно, будет двадцать или тридцать минутное видео. Нам также нужно зафиксировать время, проведенное на этой последней странице, а не только время, которое она была загружена.

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

Кажется, что эта проблема не так уж необычна, и должен быть лучший способ; Есть ли передовой подход к решению этой проблемы? Если нет, видите ли вы какой-либо способ улучшить одно из этих решений?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2008

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

Теперь вы могли бы немного улучшить это, поместив запрос ajax в таймер на каждой странице (возможно, один или два раза в минуту), чтобы обеспечить «сердцебиение», но это также имеет некоторые предостережения: Вы должны убедиться, что время сеанса все равно истечет, и вы по-прежнему не гарантированы, что пользователь не заблокирует эти запросы, возможно, отключив JavaScript.

0 голосов
/ 02 декабря 2008

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

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

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