Сейчас я делаю так: при каждой загрузке страницы, я обновляю в кеше ключ "{$user->id}.online
" на 5 мин. Если ключа нет — пользователь не в сети.
Этот способ хорош, когда надо проверить конкретного пользователя зная его id
.
Но как получить всех пользователей онлайн? Приходится загружать всех юзеров (благо их пока мало) и у каждого проверять "{$user->id}.online
". Это ужасно. Есть ли способ лучше?
Можно попробовать вычислить с помощью сессий.
Для сессий по умолчанию определено файловое хранение, где каждый сеанс индивидуально хранится на диске. Это означает, что для того чтобы выяснить сколько пользователей online
(я предполагаю, "online = набор существующих сессий $_SESSION['$nickname']
), вам нужно будет открыть все файлы сессий, сохраненные на диске, и проверить, сколько уникальных nicknam'ов
существуют внутри сессий.
Стоит учитывать что:
$_SESSION["test1"]
не может совместно использоваться несколькими другими сессиями.Вариант с записью, которая содержит список предполагаемых онлайн юзеров:
$m = new Memcached();
$m->addServer('localhost', 11211);
$now = time();
$life = 5 * 60;
$m->set("{$user->id}.online", true, $life);
if (($online_users = $m->get('online_users')) === false) {
$online_users = array($user->id => $now);
// нужно ли записывать время в значение элемента под вопросом
// возможно хватит true или 1
} else {
$online_users[$user->id] = $now;
foreach ($online_users as $id => $time) {
// ключи {$id}.online остаются для проверки
if (false === $m->get("{$id}.online")) {
unset($online_users[$id]);
} else {
// тут что-то делаем с юзером, который онлайн
// $id содержит его номер
// $time содержит время последней отметки оналайн
}
}
}
$m->set('online_users', $online_users, $life);
// в переменной $online_users массив id (номера в ключах массива) юзеров онлайн
P.S. Тестирование не проводилось. Выгоды/проигрыши не вычислялись.
Табличка в БД с двумя полями
CREATE TABLE users{
user_id INT,
last_login TIMESTAMP,
PRIMARY KEY(user_id)
}
При входе пользователя
INSERT INTO users (user_id, last_login) values ($id, NOW()) ON DUPLICATE KEY UPDATE last_login=NOW();
Соответственно, количество "активных"
SELECT COUNT(*) FROM users WHERE NOW() - last_login<$desired_timeout
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Вызывают в начале кода use Closure; это есть внутренний класс php Closure а далее используют внутри функции переменную $closure; из мануала совершенно не понятно...
Необходимо создать навигацию по сайту, к примеру с помощью клавиши пробел или shift+стрелка выделять первый элемент на странице, а если фокус...