Я думал, что опубликую способ, которым я общался, для кого-либо другого, ищущего метод типа 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;
}
}
1. Очевидно, что это дополнительный и дорогостоящий запрос к базе данных, который не помогает предоставляемая услуга, поэтому она отрицательна с точки зрения производительности. 2. Я не вижу причин для отображения какой-либо страницы ошибки, если это чисто внутреннее хранилище значений не удается, и почему. Просто проглотите и запишите ошибку, но не раздражайте своих пользователей. 3. Значение «последнего входа» всегда поражает меня как одну из тех «функций», которые выполняются только потому, что это возможно. Не. Если вообще, то не с отдельным запросом, а при обновлении базы данных в любом случае. – arkascha
Вы isset на переменных, которые будут установлены независимо ... Кроме того, они должны быть на переменные $ _SESSION. Я согласен с вышесказанным, но разве вы не можете сделать это по часам? Проверьте значение $ _SESSION, если lastActive находится в течение последнего часа, и если это так игнорировать, в противном случае обновите его. Сэкономит вам 60 запросов, при условии, что каждую минуту открывается страница. –
'Users.username' индексируется, я полагаю. –