Как определить, онлайн пользователь или нет? [PHP]
При создании раздела пользователей, часто требуется функция, определяющая статус пользователя.
Сегодня реализуем такую функцию с помощью Comet сервера, которая будет определять по списку, кто сейчас онлайн, а кто оффлайн, и если оффлайн, то когда последний раз пользователь был онлайн.
Для начала нам необходимо авторизовавать каждого пользователя при входе в свой личный кабинет. В прошлом посте по реализации Realtime уведомлений, я описал авторизацию, повторюсь и сейчас.
Нам нужен файл comet_online.php подключения к API Comet сервера.
Почему использую Comet сервер а не обычную проверку в БД?
Есть 2 причины:
1. Не хочу использовать ресурсы своего сервера.
2. Если создается кабинет для пользователей, то там всегда требуются такой функционал, как, чат, realtime оповещения и уведомления, проверка статуса… и Все это можно организовать с помощью одного Comet сервера. Если использовать Comet, то надо использовать его по полной!
<?php function CometOnlineQL($CometQuery){ $Comet_devid = '__ID__'; // id разработчика $Comet_devkey = '__KEY__'; // KEY разработчика ini_set('display_errors','on'); $link = mysqli_connect("app.comet-server.ru", $Comet_devid, $Comet_devkey, "CometQL_v1"); if (mysqli_connect_errno()){ CometOnlineQL($CometQuery); exit(); }; $result = mysqli_query ( $link, $CometQuery ); if(mysqli_errno($link) != 0) { echo "<b>Error code:<a href='https://comet-server.ru/wiki/doku.php/comet:cometql:error' target='_blank' >".mysqli_errno($link)."</a> Error text:<a href='https://comet-server.ru/wiki/doku.php/comet:cometql:error' target='_blank' >".mysqli_error($link)."</a></b>"; } else if(@mysqli_num_rows($result)) { $row = mysqli_fetch_assoc($result); do{ $b[$row['id']] = $row['time']; }while($row = mysqli_fetch_assoc($result)); } else { echo "<b>Empty set</b>\n"; } mysqli_close ( $link ); return $b; } ?>
ID и КЛЮЧ разработчика Вы можете получить на самом сайте Comet сервера http://comet-server.ru/
Допустим пользователь проходит авторизацию на сайте и при этом мы авторизуем его на Comet сервере следующим фрагментом, где $Comet_uid — это id пользователя, $Comet_ulogin — это логин пользователя и $Comet_devid — это публичный ID разработчика.
include('comet_online.php'); CometOnlineQL("INSERT INTO users_auth (id, hash) VALUES (".$Comet_uid.", '".md5($Comet_ulogin)."');");
Hash — это защита, его нужно использовать для инициализации пользователя на получение уведомлений.
И мы должны соединить Comet сервер и страницы браузера кабинета пользователя, для постоянного обмена информацией.
На всех страницах кабинета, должен находиться следующий код
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>; <script src="http://comet-server.ru/CometServerApi.js"></script> <script> $(function() { CometServer().start({dev_id:<?=$Comet_devid;?>, user_id:"<?=$Comet_uid;?>", user_key:"<?=md5($Comet_ulogin);?>"}); </script>
Теперь Comet сервер может получать информацию от пользователей, и у нас есть возможность вытащить эту информацию.
Не буду использовать БД, просто для примера допустим что у нас есть массив из БД.
<? $mas = array( array( 'id' => '1', 'name' => 'Вася', ), array( 'id' => '2', 'name' => 'Петя', ), array( 'id' => '3', 'name' => 'Маша' ) ); ?>
Чтобы вытащить информацию о пользователях, нам нужны ID интересующих нас на данный момент пользователей.
Получаем список
if($mas){ foreach($mas as $item){ $on_u[] = $item['id']; } $on_users = implode(', ', $on_u); }
И получаем информацию от Comet, следующим способом
if($on_users){ include('comet_online.php'); $user_time = CometOnlineQL('SELECT * FROM users_time WHERE id IN( ' . $on_users . ' );'); }
У нас «в руках» следующий формат данных
-1 — Пользователь ни когда не был авторизован
0 — Пользователь онлайн
([0-9]+) — дата последнего входа в кабинет в UNIX-time
данные мы загнали в переменную $user_time, тем самым отобразить результат можно так $user_time[__ID_ПОЛЬЗОВАТЕЛЯ__]
а значит при выводе списка пользователей можем подставить значения (-1, 0 и ([0-9]+))
foreach($mas as $item){ echo $item['name'] . '-' . $user_time[$item['id']] . '<br>'; } НО, в этом случае мы отображаем не совсем понятные данные для нас, поэтому подключем маленькую функцию для расшифровки значений. function ResultTime($data){ switch($data){ case '0': $r = 'Онлайн'; // пользователь онлайн break; case '-1': $r = ''; // пользователь ни разу не авторизовывался break; default: $r = date('d.m.Y', $data); // Дата последнего входа пользователя break; } return $r; }
И сделаем вывод через неё.
foreach($mas as $item){ echo $item['name'] . '-' . ResultTime($user_time[$item['id']]) . '<br>'; }
Вот собственно и всё! Теперь мы знаем, какой пользователь онлайн а кто нет.
Если что не так, писать в комментарии…
Добавить комментарий