Определение пользователей on-line

На каждом серьезном сайте наверника часто возникает потребность узнать сколько народу на сайте.
Примеров скриптов в инете много, но чаще всего это простой скрипт подсчитывающий количество сессий.

Но как  узнать какие именно юзеры на сайте?
Вот я и решил набросать свой скриптик, заодно и разобрать как это сделать)

Для начала нам понадобится таблица в БД.
примерно такая:

id – id (auto_increment)
page –  адрес страницы где находится пользователь
id_user – id пользователя
date – дата последней активности пользователя
login – логин пользователя, это для простоты, чтоб не плодить сложные запросы)

Напоминаю, что в начале нужно установить соединение с сервером sql
а теперь пишим сам код:

1
2
3
4
//Сессии которые нам будут необходимы в процессе работы
$_SESSION['USER']['ID'] - id пользователя
$_SESSION['USER']['LOGIN'] - Логин пользователя
$_SESSION['USER']['TMP'] - Для авторизированного пользователя будет содержать его id, для гостя время входа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Устанавливаем время жизни сесии пользователя
define ('SESION_TIME',5);
//Для простоты в $TABLE записываем имя нашей таблицы
$TABLE = 'user_online_temp';
//запоминаем текущее время
$t=time();
//Адрес текущей страницы
$page = $_SERVER['REQUEST_URI'];

//Устанавливаем флаг $its, для чего он нужен увидите позже
$its=true;

//Проверяем существование сесси, если ее нет, то создаем
//При авторизации вам нужно будет прописать в эту сесию id пользователя
if(!isset($_SESSION['USER']['TMP'])){
    //Если пользователь уже авторизирован, например по кукам, то записываем туда его id
    if($_SESSION['USER']['ID']){
        $_SESSION['USER']['TMP']=$_SESSION['USER']['ID'];
        $LOGIN = $_SESSION['USER']['LOGIN'];
    }else{
        //Иначе записываем туда время входа
        $_SESSION['USER']['TMP']=$t;
        //В качестве логина будим использовать слово гость, по ниму потом будем считать количество гостей
        $LOGIN = 'guest';
    }
}

//Формируем и отпровляем SQL запрос
$r=mysql_query("SELECT * FROM $TABLE");
while($rez = mysql_fetch_array($r)){
    //id,id_user,date,page,login
    //Если это запись текущего пользователя, то обновляем ее
    if($rez['id_user']==$_SESSION['USER']['TMP']){
        //Обновляем запись
        mysql_query("UPDATE `$TABLE` SET `date` = '$t',`page` = '$page',`login` = '$LOGIN' WHERE `id` = ".$rez['id']." LIMIT 1 ;");
        //"Выключаем" флаг
        $its=false;
    }else{
        //Это запись другого пользователя
        //Проверяем не истеклоли время ее жизни
        //Помним что время у нас в минутах, по этому умножаем его 60
        if($t-$rez['date']>SESION_TIME*60){
            //Если истекла, то удаляем
            mysql_query("DELETE FROM `$TABLE` WHERE `id` = ".$rez['id']." LIMIT 1";
        }
    }
}
//Вот нам и понадобился флаг)
//Он показывает нужно ли создавать новую запись, т.е. есть ли пользователь уже в БД
//Если флаг активен, то делаем запись
if($its){
    mysql_query("INSERT INTO `$TABLE` (`id_user`,`page`,`date`,`login`)
    VALUES ('"
.$_SESSION['USER']['TMP']."','$page','$t','$LOGIN');";
}

Вот мы и получаем в результате этого скрипта, таблицу с активными пользователями
Но их еще нужно обработать

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Для удобства я решил оформить ее в функцию
function OnlineUser(){
    //Так как мы все еще работаем с этой таблицей, сделаем ее доступной)
    global $TABLE;
    //Определяем текущую страницу и разбераем ее не "запчасти"
    //результат: array('patch'=>"адрес к файлу",'query'=>'остальные гет параметры')
    $pageDetail=parse_url($_SERVER['REQUEST_URI']);
    //получаем все записи
    $r=mysql_query("SELECT * FROM $TABLE");
    while($rez = mysql_fetch_array($r)){
        //Разбераем страницу пользователя
        $pageUser=parse_url($rez['page']);
        //Если совпадает адрес текущей страницы и страницы пользователя
        if($pageUser['path']==$pageDetail['path']){
            //Если пользователь гость
            if($rez['login']=='guest'){
                //То накручиваем счетчик пользователей
                $AsResult['FOLDER']['GOUST']++;
            }else{
                //Иначе добовляем в массив пользователя
                $AsResult['FOLDER']['USER'][$rez['id_user']]=$rez['login'];
            }
            //Проверяем совпадение гетовских данных
            //Проверку делаем тока в том случае, если path`и совпали
            if($pageUser['query']==$pageDetail['query']){
                if($rez['login']=='guest'){
                    $AsResult['PAGE']['GOUST']++;
                }else{
                    $AsResult['PAGE']['USER'][$rez['id_user']]=$rez['login'];
                }
            }
        }
        if($rez['login']=='guest'){
            $AsResult['GLOBAL']['GOUST']++;
        }else{
            $AsResult['GLOBAL']['USER'][$rez['id_user']]=$rez['login'];
        }
    }
    return $AsResult;
}

Что вернет функция:

$AsResult['GLOBAL']['GOUST'] – Количество гостей на всем сайте
$AsResult['GLOBAL']['USER'] – список всех пользователей на сайте
$AsResult['FOLDER'] – то же что и выше, но для текущей страницы
$AsResult['PAGE'] – то же, но для страницы со всеми гетами и пр…

Вот примерно как это можно реализовать.
Это лишь скилет, который вы можите подогнать под свои нужды)
Удачи!

Свои замечания и предложения в комменты)

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru TEXT LINK Mister Wong

Читай с RSS. Не пропусти интересное)

Теги:

Суббота, 24 Янв 2009 PHP

Комментариев пока нет.

Ваш отзыв

Читать в Яндекс.Ленте
регистрация доменов
Зарегистрируй себе домен!
.RU - 99 рублей в год
www.
Блогун - реклама в блогах. Хостинг для блогов

Поиск

 

Комментарии