Разрабатываю сайты

БЛОГ ПРО WEB

Рассказываю о web-разработке
и помогаю создавать сайты

Как определить, онлайн пользователь или нет? [PHP]

wps-wpimage

При создании раздела пользователей, часто требуется функция, определяющая статус пользователя.
Сегодня реализуем такую функцию с помощью 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>&nbsp;&nbsp;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>';
}

Вот собственно и всё! Теперь мы знаем, какой пользователь онлайн а кто нет.

Если что не так, писать в комментарии…


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *