Отслеживание количества часов, проведенных пользователями на моем сайте. - PullRequest
3 голосов
/ 02 января 2012

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

моя первоначальная идея относительнокак это сделать: пользователь загружает страницу, а запись для пользователя сохраняется в таблице SQL с именем accessLog * пользователь загружает другую страницу, SQL-запрос запускается, чтобы увидеть, когда они последний раз посещали страницу * если пользователь посетил страницу в течение последних двух минут, обновите его учетную запись и добавьте время, проведенное в Интернете * вставьте новую запись в accessLog *

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

Ответы [ 7 ]

3 голосов
/ 03 января 2012

Я бы использовал ajax, чтобы заставить клиентов звонить на сервер каждую минуту или около того.Просто чтобы сообщить серверу, что пользователь все еще смотрит эту страницу.

  • Сервер будет иметь метку lastTimestamp и totalTimeSpentOnSite в базе данных.LastTimestamp будет просто иметь последний раз, когда произошел ajax-запрос или загрузка страницы.

  • Каждый раз при запуске ajax сервер вычисляет now - lastTimestamp и добавляет это к totalTimeSpentOnSite.

Чтобы сделать его еще более точнымможет
добавить прослушиватели javascript к onBlur(), чтобы записывать только фактическое время, проведенное с активным этим окном, а затем отправить это время на сервер вместо того, чтобы просто сообщить серверу, что пользователь все еще активен.

3 голосов
/ 02 января 2012

Мой способ сделать это прост:

  • Когда пользователь загружает страницу, его «время загрузки последней страницы» обновляется в базе данных.
  • скрипт cron запускается каждую минуту. Он ищет пользователей, чье «время последней загрузки страницы» было в последнюю минуту.
  • Увеличивать "время, проведенное на сайте" для каждого найденного пользователя.

Таким образом, я могу отслеживать пользователей с точностью до минуты. Просто разделите на 60, чтобы получить часы.

2 голосов
/ 02 января 2012

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

  1. Журнал загрузки каждой страницы.
  2. Каждые несколько часов запускайте скрипт через cron, который рассчитывает время тратится онлайн для каждого пользователя и обновляет промежуточную сумму у пользователя таблица.
  3. Периодически очищайте вашу таблицу access_log.
1 голос
/ 02 января 2012

Правило «двух минут» немного ненадежно, и вы можете попытаться понять, что на самом деле означает «потраченное время».

В предыдущем проекте мы сделали следующее.

При каждой загрузке страницы мы проверяли, был ли у пользователя текущий сеанс, и, если нет, создавали GUID для идентификации текущего сеанса.

Мы записывали запись журнала в базу данных с помощьюdatetime, GUID, URL страницы и ID пользователя (если пользователь вошел в систему).

Чтобы вычислить «затраченное время», мы рассчитали разницу во времени между первой и последней записью для GUID сеанса и добавилиодну минуту, чтобы отразить время, проведенное на последней странице.

Это не совсем точно, но оно может работать в режиме реального времени без использования CRON для сайтов с умеренным объемом трафика.

1 голос
/ 02 января 2012

Добавьте его в управление сессиями.Когда пользователь начинает свою сессию, запишите его время начала.Когда пользователь заканчивает свою сессию, запишите время его окончания.Простая математика оттуда соберет вам общее количество времени, которое они тратят за сеанс на вашем сайте.


Чтобы ответить Филип Хаглунд

дано вам придется подождать, пока истечет время ожидания сеанса, и это время не отражает фактического времени, проведенного пользователем на последней странице, прежде чем он / она закрыли ее.

Это правда, нос другой стороны, все доступные на данный момент ответы работают в одной и той же базовой посылке:

  1. Записать время загрузки страницы.
  2. Записать, когда пользователь выйдет
  3. Обновлениетаблица базы данных

Так уж сложилось, что для входа в систему, когда пользователь покидает вас, нужны сеансы.Я не знаю другого способа в PHP отслеживать действия пользователя так, как этого хочет OP.Обновление таблицы базы данных является техническим вопросом.Вы хотите использовать работу CRON?Вы хотите использовать AJAX?Вы хотите заняться чем-то еще?

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

0 голосов
/ 18 апреля 2019

Это то, что я использую, и он проверяет обновления БД в любое время, когда пользователь загружает любую страницу.Данные являются точными, так как они рассчитывают, загружает ли пользователь страницу в минуту, и если да, то добавляют разницу во времени в БД.

  $now= time();
 $stmt = $db_con->prepare(" SELECT last_seen,time_online FROM user_online_log  WHERE user_id=?  limit ?  ");
     $stmt->execute(array( $user_id, 1));       
     $fetch= $stmt->fetch(PDO::FETCH_ASSOC);  
   $last_seen=$fetch['last_seen'];  //integer value from db, saved from time() function
  $last_seen_plus_one_min= $last_seen + 60;
  if(  $now  <   $last_seen_plus_one_min   ){ 
  $additional_time_online= $now -   $last_seen; }
  else{ $additional_time_online = 0; }


     //update db
 $stmt12 = $db_con->prepare(" update user_online_log set   last_seen=?, time_online = time_online+? WHERE user_id=?  limit 1  ");
 $stmt12->execute(array($now, $additional_time_online,  $user_id)); 
0 голосов
/ 05 декабря 2017
  • сначала выберите продолжительность, после которой сеанс считается прерванным. (например: 10 минут)
  • регистрировать загрузку всей страницы со всеми ip в базе данных
  • , если время между загрузкой двух страниц для одного ip превышает длительность, не добавляйте это время к общему времени для этого ip.
  • если время между загрузкой двух страниц для одного ip меньше продолжительности, добавьте это время к общему времени для этого ip

2 проблема: - если пользователь остается на странице более 10 минут без обновления, он считается отключенным. - длительность последней страницы не сохраняется

Piwik работает так

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