2016-02-14 4 views
2

Я использую простой скрипт, в верхней части каждой страницы, которая будет обновлять LastActive столбец в базе данных:Последний онлайн PHP

$username = $_SESSION['username']; 
$userID = $_SESSION['user_id']; 

if(isset($username, $userID)) { 

    if ($insert_stmt = $mysqli->prepare("UPDATE Users SET lastActive = DATE_ADD(Now(), interval 6 hour) WHERE username = ?")) { 
     $insert_stmt->bind_param('s', $username); 
     // Execute the prepared query. 
     if (! $insert_stmt->execute()) { 
      $insert_stmt->close(); 
      header('Location: ../headers/error.php?err=Failed Upload'); 
     } 
    } 
    $insert_stmt->close(); 
} 

Я всегда хочу, чтобы сохранить производительность и безопасность в виду. Это приведет к плохой работе в будущем с 000-ыми соединениями?

Как использовать cookie-файлы (а не то, что я знаю как) отличаются от простого сценария?

Благодаря

редактировать:

$username = $_SESSION['username']; 
$userID = $_SESSION['user_id']; 
$loginTime = $_SESSION['timestamp']; 
date_default_timezone_set("Europe/London"); 
$now = new DateTime(); 
$diff=$now->diff($loginTime); 
$minutes = $diff->format(%i); 

if(isset($username, $userID) && $minutes> 30) { 
    $_SESSION['timestamp'] = $now; 
    $online = true; 
} 
+2

1. Очевидно, что это дополнительный и дорогостоящий запрос к базе данных, который не помогает предоставляемая услуга, поэтому она отрицательна с точки зрения производительности. 2. Я не вижу причин для отображения какой-либо страницы ошибки, если это чисто внутреннее хранилище значений не удается, и почему. Просто проглотите и запишите ошибку, но не раздражайте своих пользователей. 3. Значение «последнего входа» всегда поражает меня как одну из тех «функций», которые выполняются только потому, что это возможно. Не. Если вообще, то не с отдельным запросом, а при обновлении базы данных в любом случае. – arkascha

+0

Вы isset на переменных, которые будут установлены независимо ... Кроме того, они должны быть на переменные $ _SESSION. Я согласен с вышесказанным, но разве вы не можете сделать это по часам? Проверьте значение $ _SESSION, если lastActive находится в течение последнего часа, и если это так игнорировать, в противном случае обновите его. Сэкономит вам 60 запросов, при условии, что каждую минуту открывается страница. –

+0

'Users.username' индексируется, я полагаю. –

ответ

0

Я думал, что опубликую способ, которым я общался, для кого-либо другого, ищущего метод типа Online Online. Конечно, это могло быть сделано намного лучше, но работает в моей ситуации.


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

При входе в систему пользователя я обновляю столбец в моей таблице пользователей с отметкой времени Now() и добавляю это к их данным сеанса.

В верхней части каждой страницы я запускаю скрипт, чтобы проверить, вошел ли пользователь в систему и получить временную метку из данных сеанса.если эти данные 45 минут старый, сценарий будет обновлять настройки в lastActive столбец моей таблицы пользователей таблицы Now();

<?php 
include_once 'functions.php'; 

if(isset($_SESSION['username'], $_SESSION['user_id'], $_SESSION['lastActive'])) { 
    date_default_timezone_set("Europe/London"); 
    $now = new DateTime(); 
    $lastActive = $_SESSION['lastActive']; 
    $diff=$now->diff($lastActive); 
    $hours = $diff->format('%h'); 
    $mins = $diff->format('%i'); 
    $day = $diff->format('%d'); 
    $month = $diff->format('%m'); 
    $year = $diff->format('%y'); 



    if($mins > 45 || $hours >= 1 || $day >= 1 || $month >= 1 || $year >= 1) { 
     $_SESSION['lastActive'] = $now; 
     set_last_active($mysqli, $_SESSION['username']); 
    } 
} 

set_latst_action просто просто:

function set_last_active($mysqli, $username) { 
    if ($stmt = $mysqli->prepare("UPDATE Users SET lastActive = Now() WHERE username = ?")) { 
     $stmt->bind_param('s', $username); 
     $stmt->execute(); 
     $stmt->close(); 
    } 
} 

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

function isOnline($mysqli, $username) { 
    if ($stmt = $mysqli->prepare("SELECT lastActive FROM Users WHERE username = ? LIMIT 1")) { 
     $stmt->bind_param('s', $username); 
     $stmt->execute(); 
     $stmt->store_result(); 

     if ($stmt->num_rows == 1) { 
      $stmt->bind_result($return); 
      $stmt->fetch(); 
      $lastActive = $return; 

     } else { 
      // user does not exist 
      $lastActive = ""; 
      return $lastActive; 
      $stmt->close(); 
     } 
    } else { 
     // SELECT failed 
     $lastActive = ""; 
     return $lastActive; 
     $stmt->close(); 
    } 

    if (!empty($lastActive)) { 
     date_default_timezone_set("Europe/London"); 
     $dateNow = new DateTime; 
     $lastActiveDate = new DateTime($lastActive); 
     $diff=$dateNow->diff($lastActiveDate); 

     $hours = $diff->format('%h'); 
     $mins = $diff->format('%i'); 
     $day = $diff->format('%d'); 
     $month = $diff->format('%m'); 
     $year = $diff->format('%y'); 

     if ($mins > 45 || $hours >= 1 || $days >= 1 || $month >= 1 || $year >= 1) { 
      $return = "Offline"; 
      return $return; 
     } 
     else { 
      $return = "Online"; 
      return $return; 
     } 
    } 
    else { 
     $return = "Offline"; 
     return $return; 
    } 
} 
0

Все, что вы сделали с печеньем будут данные, предоставленные вашими пользователями, то вы не можете доверять.

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

Вы должны сделать это на стороне сервера и да, база данных не работает.

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

1

Пара предложений:

  1. Вы можете сделать это с помощью AJAX, так что LastVisited обновляется асинхронно после загрузки страницы пользователя. Таким образом, не будет никакого влияния на время загрузки страницы для пользователя.

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

Смежные вопросы