Я использую PHP / MYSQL. Каждый раз, когда пользователь входит в систему, мы вставляем время, в которое они вошли в систему, и дату, когда они вошли в систему. В то время как его легко понять, сколько пользователей зарегистрировалось в определенный день, я не уверен, как рассчитать, сколько времени они потратили на сайт ,
Например, точно так же, как пользователь подписывается и мы вставляем запись в таблицу login_tracking, мы также обновляем эту запись, когда пользователь нажимает «logout» с момента их выхода из системы. Таким образом мы вычитаем время входа в систему и выходим из системы, и мы получаем время каждого человека, но что произойдет, если большинство людей не ударят «выход из системы» и вместо этого очистят файлы cookie / кеш или просто закроют окно / вкладку, где был открыт сайт в?
Есть лучший способ сделать это? Я использую Google Analytics, который дает мне пользователей и посещений, которые появляются каждый день, но я хочу, чтобы что-то проприетарное отслеживать использование?
Любые идеи, что я могу сделать?
Обновление: @Paul спросил, использую ли я сеансы. Я и это то, как я его использую:
$ username = $ _SESSION ["username"];
Вы можете сделать это, установив время даты в момент входа в систему.
Поэтому, когда пользователь регистрируется, вы обновляете поле mysql, которое является DATETIME
, что-то вроде …
$q = $dbc -> prepare("UPDATE accounts SET loggedOn = NOW() WHERE username = ?"); $q -> execute(array($_SESSION['username']));
Теперь все, что вам нужно сделать, это создать еще несколько столбцов в вашей таблице базы данных, называемой totalTime
, и один из них называется active
или любым другим, что вам нравится.
На каждой странице загружайте active
обновление, которое является столбцом DATETIME
также с NOW()
,
$q = $dbc -> prepare("UPDATE accounts SET active = NOW() WHERE username = ?"); $q -> execute(array($_SESSION['username']));
Это гарантирует, что вы знаете, если пользователь все еще находится в сети или нет, вы можете проверить, когда они были в последний раз активны. Теперь скажите, если после 5 минут бездействия вы хотите найти общее время, которое вы просто делаете,
$q = $dbc -> prepare("UPDATE accounts SET totalTime = ADDDATE(totalTime, DATEDIFF(NOW(), loggedOn)) WHERE active < DATE_SUB(NOW(), INTERVAL 5 MINUTE)"); $q -> execute();
То, что было loggedOn
выше, заключается в том, что если пользователи неактивны в течение 5 минут, это займет время loggedOn
минус это с текущего времени, в результате чего вы получите общее время на сайте и добавьте его в столбец DATETIME
totalTime
.
Просто поставьте последний запрос как набор cron каждые 5 минут, и у вас есть довольно точная мера времени людей на вашем сайте.
Я сделал простой скрипт для чата, который делает что-то вроде этого.
То, что я сделал, это хранить идентификатор сеанса и отметку времени в таблице. На каждой странице, которую они посещают, я бы обновил метку времени. Когда они выходят из системы, я уничтожаю их журнал. У меня также была проверка скрипта обновления для других пользователей, которые были «неактивны» в течение 5 минут и удалили их. Вы можете сделать то же самое, установив задание cron, которое будет выполняться каждые 5 или 10 минут, и отметьте те отметки времени, которые старше 5-10 минут, и отметьте этих пользователей как неактивные, а затем рассчитайте общее время, проведенное на сайте.
Если вы просто хотите, чтобы количество пользователей было активным в определенное время, я бы посмотрел на http://whos.amung.us/ . Его простой плагин, который подсчитывает количество людей в Интернете в любой момент времени и откуда они происходят.
Я предлагаю вам использовать поле «последнее использованное» вместо поля, которое содержит дату / время выхода из системы, а также поле «первым использованием» вместо поля, содержащего дату / время входа.
Всякий раз, когда пользователь запрашивает страницу, вы будете проверять значение «последнего использованного», если это было не так давно (например, менее 15 минут, например), вы обновите его до текущей даты / времени, иначе у вас будет для создания новой записи в базе данных (предположим, что пользователь находится в новом «сеансе» прямо сейчас, но не нужно создавать новый). И, конечно же, связать сеанс с вновь созданной записью.
Это псевдокод:
Page Requested if new session create session create database record (first used=now, last used = now) associate the session with the record else query the record associated with the current session if long ago create a new record (first used=now, last used = now) associate the new record with the current session else update the existing record (last used = now)
Это выглядит просто, я не пытался его реализовать.
Откорректируйте таблицу login_tracking, чтобы включить:
Код:
$date = date('Ymd H:i:s'); $time=time(); $time_check=$time-600; // user will be marked online if they have any activity for 10 minutes $session=session_id(); // check if the user is currently listed as online in the database $getactiveession = mysql_query("SELECT * FROM login_tracking WHERE session = '$session' AND end IS NULL"); $active_session = mysql_num_rows($getactivesession); // if they are not listed as online, insert a row for them if($active_session == "0"){ $make_active = mysql_query("INSERT INTO login_tracking (session, user_id, time, start) VALUES('$session', '$user', '$time', '$date')"); } else { // UPDATE user's current time if they are already currently logged in $update_session = mysql_query("UPDATE login_tracking SET time = '$time', user_id = '$user' WHERE session = '$session'"); } // get total users online $gettotalonline = mysql_query("SELECT * FROM login_tracking"); $total_online = mysql_num_rows($gettotalonline); // if over 10 minutes and no new activity (time column has not been updated), update end session time $end_session_time = mysql_query("UPDATE login_tracking SET end = '$date' WHERE time<$time_check");
С помощью этого вы можете отобразить список всех онлайн-пользователей, а также ссылки на их профиль, аватары и т. Д.
Единственное, что я могу придумать, – это вставить новую строку для нового зарегистрированного пользователя, вам может потребоваться «WHERE end =« 0000-00-00 00:00:00 »вместо« WHERE end IS NULL », а не конечно, если вы можете сделать IS NULL в datetime.
Ответ на ваш комментарий № 1
У меня есть СМЕЖНАЯ вещь как функция на моем сайте, которая размещается на каждой странице, вне зависимости от того, какую страницу просматривает мой пользователь, они будут считаться зарегистрированными. Так что ее легко реализовать повсюду.
Тем не менее, вам, вероятно, потребуется установить часть его в виде cronjob для запуска каждую минуту или 10 минут для проверки записей в течение 10 минут. Я говорю об этом, потому что … если пользователь закрывает свой браузер, но не выходит из системы, он не будет обновлять свою запись в базе данных до тех пор, пока другой человек (вошедший в систему или гость) не получит доступ к странице, на которой выполняется этот код. Если у вас запущен cronjob, тогда проблем не будет. (это также касается вашего комментария о завершении сеанса окончания сеанса, мой сайт не требует, чтобы так счастлив, что вы подняли суть вопроса, поэтому для вас было бы обязательным, чтобы я подумал). Что касается перенаправления их на страницу выхода, я не уверен, как это будет работать в этом случае, поскольку их страница не обновляется. Вероятно, это должно быть ajax или что-то еще.