2012-01-25 5 views
3

Я использую PHP/MYSQL. Каждый раз, когда пользователь входит в систему, мы вставляем время, в которое они вошли в систему, и дату, когда они вошли в систему. В то время как его легко понять, сколько пользователей зарегистрировалось в определенный день, я не уверен, как рассчитать, сколько времени они потратили на сайт ,Как отслеживать использование пользователей на сайте?

Например, как только пользователь подписывается и мы вставляем запись в таблицу login_tracking, мы также обновляем эту запись, когда пользователь нажимает «logout» с момента их выхода из системы. Таким образом мы вычитаем время входа в систему и выходим из системы, и мы получаем время каждого человека, но что произойдет, если большинство людей не ударят «выход из системы» и вместо этого очистят файлы cookie/кеш или просто закроют окно/вкладку, где был открыт сайт в?

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

Любые идеи, что я могу сделать?

Обновление: @Paul спросил, пользовался ли я сессиями. Я и это то, как я его использую:

$ username = $ _SESSION ["username"];

+0

Вы используете '$ _SESSIONS' –

+0

@Paul yes: $ username = $ _SESSION [" username "]; – AAA

+1

AFAIK, нет никакого способа справиться с этим, не разрушая сеанс пользователей после того, как они неактивны в течение заданного периода времени. Эта ссылка может помочь вам немного больше. http://stackoverflow.com/questions/805895/how-come-closing-a-tab-doesnt-close-a-session-cookie –

ответ

1

Я создал простой скрипт для чата, который делает что-то вроде этого.

Что я делал, это хранить идентификатор сеанса и отметку времени в таблице. На каждой странице, которую они посещают, я бы обновил метку времени. Когда они выходят из системы, я уничтожаю их журнал. У меня также была проверка скрипта обновления для других пользователей, которые были «неактивны» в течение 5 минут и удалили их. Вы можете сделать то же самое, установив задание cron, которое будет выполняться каждые 5 или 10 минут, и отметьте те отметки времени, которые старше 5-10 минут, и отметьте этих пользователей как неактивные, а затем рассчитайте общее время, проведенное на сайте.

Если вы хотите, чтобы количество пользователей было активным в определенное время, я бы посмотрел http://whos.amung.us/. Его простой плагин, который подсчитывает количество людей в Интернете в любой момент времени и откуда они происходят.

1

Я предлагаю вам использовать поле "last used" вместо поля, которое содержит дату/время выхода из системы, а поле "first used" вместо поля, содержащего дату/время входа.

Всякий раз, когда пользователь запрашивает страницу, вы будете проверять значение «последнее использованное», если это было не так давно (например, менее 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) 

Это выглядит просто, я не пытался ее реализовать, хотя.

+0

OMFG !! не могу поверить, что я не думал об этом. Однако один из недостатков - это то, что происходит, когда пользователь остается на одной странице и не выходит из системы, а затем закрывает вкладку или окно. – AAA

+0

Здесь нет недостатка, когда вы создаете новую запись для нового «сеанса», вы устанавливаете «первый использованный» (я предполагаю это имя вместо «login») И «последний использованный» для текущей даты, и что на самом деле реально, если вы думаете об этом :) –

2

Вы можете сделать это, установив время даты в момент входа в систему.

Поэтому, когда журнал пользователя на обновлении 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(); 

Что выше делает, если пользователи неактивные в течение 5 минут, это займет loggedOn время минус из текущего времени , оставив вас с общим временем на сайте и добавьте его в колонку DATETIMEtotalTime.

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

1

Настройте таблицу login_tracking включать:

  • session_id (VARCHAR 100)
  • user_id
  • время (обновления каждые 10 минут до тех пор, пока активность)
  • начало (DateTime, при первом входе в систему)
  • конец (дата и время, когда сеанс убит либо закрытым браузером, либо выход)

Код:

$date = date('Y-m-d 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 на Дата и время.

Ответ на ваш комментарий # 1

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

Однако вам, вероятно, нужно будет установить часть его в виде cronjob для запуска каждую минуту или 10 минут для проверки записей в течение 10 минут. Я говорю об этом, потому что ... если пользователь закрывает свой браузер, но не выходит из системы, он не будет обновлять свою запись в базе данных до тех пор, пока другой человек (вошедший в систему или гость) не получит доступ к странице, на которой выполняется этот код. Если у вас запущен cronjob, тогда проблем не будет. (это также касается вашего комментария о завершении сеанса окончания сеанса, мой сайт не требует, чтобы так счастлив, что вы подняли суть вопроса, поэтому для вас было бы обязательным, чтобы я подумал). Что касается перенаправления их на страницу выхода, я не уверен, как это будет работать в этом случае, поскольку их страница не обновляется. Вероятно, это должно быть ajax или что-то еще.

+0

Спасибо за скрипт! Скажем, через 10 минут бездействия он обновляет таблицу, но как выполняется $ end_session_time? И мне это нужно на всех страницах? Кроме того, если бы я хотел, чтобы пользователь вышел из системы через 10 минут, как я могу включить заголовок («Location: logout.php»); до $ end_session_time – AAA