2014-11-22 3 views
0

Как бы добавить область, показывающую, какие пользователи находятся в сети, пока они не покинут страницу или не выйдут из системы?Добавить 'Online Users' area

Я думал о создании таблицы, которая удерживает сеанс пользователей до тех пор, пока они не покинут страницу, но как я смогу сказать, когда они уйдут? Мне нужно только обновить его каждые 5 секунд. Я хочу, чтобы держаться подальше от хрон рабочих мест только в случае окон (окна не поддерживает хрон это делает?)

Спасибо за любую помощь

ответ

0

я сделал нечто подобное в одном из наших приложений некоторое время назад. Привяжите вызов Ajax к некоторому событию, например click или mousemove. В этом вызове запишите метку времени в таблицу active_users. Напишите еще одну функцию для запроса этой таблицы и выберите пользователей с отметкой времени старше 5 минут. Назовите это через Ajax, а также в определенные промежутки времени или на мероприятии broeser.

0

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

В качестве общего вопроса о дизайне вам, вероятно, понадобится средство для хранения количества пользователей в Интернете (подробнее об обнаружении этого ниже) либо в памяти (бэкэнд-сервис, в БД памяти, такой как redis или memcached), либо на диске (обычный БД).

Что касается обнаружения, когда пользователи подключены к сети, это может быть довольно сложной проблемой, но если предположить, что точное число до второго номера не так важно, вы можете увеличить число (в БД или памяти сверху) когда вы обслуживаете страницу (PHP) или когда пользователь загружает страницу (Javascript).

Что касается обнаружения, когда пользователь прошел навигацию, вы можете использовать обработчик onunload в Javascript, чтобы он уведомлял сервер, когда пользователь перемещается. Одно из предостережений - это то, что это сообщение может быть потеряно или не отправлено (т. Е. Отключено JS, сбой браузера и т. Д.), И ваш счет может стать дико неточным.

Кроме того, клиент может пинговать сервер с сердцебиением каждый [predefined interval] и сервер будет знать, что они находятся в сети (декремент счетчика, когда пользователь прекращает посылать сердцебиение, предполагая, что они перемещаться в сторону)

На основе этих высокого уровня, их также можно объединить, чтобы сформировать гибридное решение, используя heartbeats, чтобы обнаружить, что пользователи все еще находятся в сети, и обработчик onunload, чтобы сразу же сообщить серверу о закрытии/навигации.

Наконец, как и примечание о работе cron, Windows не имеет cron per se, но может выполнить аналогичную цель, используя запланированные задачи.

+0

есть ли настройки баз данных, которая будет удалить их после й минут, если она не была обновлена ​​в течение й минут – Cheesecake

+0

Или может вы указываете мне в правильном направлении для биения сердца идея? – Cheesecake

+0

обратитесь к моему ответу, чтобы узнать, как я это сделал – Cheesecake

0

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

Используйте JavaScript, чтобы спрашивать у ваших пользователей время от времени посещать/удалять сервер и использовать этот запрос для хранения пользователей. Пример части JavaScript с помощью JQuery:

var ajaxCall; 
var livedataTimer; 
function poll(timeout){ 
    livedataTimer = setTimeout(function(){ 
     if (ajaxCall != null){ 
     ajaxCall.abort(); 
     } 
     if (timeout == 5){ 
     timeout = 10000; 
     } 
     ajaxCall = $.ajax({ url: '/ajax/bump.php', type: 'POST', success: function(data){ 
     poll(timeout); 
     }, dataType: "json"}); 
    }, timeout); 
    return livedataTimer; 
} 

Пример /ajax/bump.php файла:

<?php 

session_start(); ## to know which user is online 

## connect to your DB somewhere 

mysqli_query($connection," 
    INSERT INTO `online-status` 
    (`user`, `time`) 
    VALUES 
    (".(int)$_SESSION['user']['id'].", UNIX_TIMESTAMP()) 
"); 

return TRUE; ## return TRUE so that ajax knows the file has completed 

?> 

Теперь, чтобы получить список онлайн пользователей, вы можете поиск вашего online-status таблицы с условием, для например, «где время не старше 20 секунд."

Это хорошая практика, чтобы INSERT данные в отдельную базу данных, не UPDATE метки времени, в базе данных userlist. Они, как правило, довольно медленно.

0

Я использовал функцию time();, чтобы вставить значение в пользователей стол каждый раз, когда пользователь посетил страницу, и вытащил его и и использовать эту функцию,

 echo '<h3>Online Users</h3>'; 
     $query = "SELECT * FROM users"; 
     $data = mysqli_query($dbc, $query); 
     while ($row = mysqli_fetch_array($data)){ 
     if(time() - 10 < $row['active']){ 
     echo '<a href="index.php?action=ucp&uid='.$row['uid'].'">'.$row['username'].'</a>'; 
     } 
     } 
Смежные вопросы