Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


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

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

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

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

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

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

//Сессии которые нам будут необходимы в процессе работы
$_SESSION['USER']['ID'] - id пользователя
$_SESSION['USER']['LOGIN'] - Логин пользователя
$_SESSION['USER']['TMP'] - Для авторизированного пользователя будет содержать его id, для гостя время входа

Код

Дальше код с коментариями
//Устанавливаем время жизни сесии пользователя
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');";
}



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

//Для удобства я решил оформить ее в функцию
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'] - то же, но для страницы со всеми гетами и пр…

Вот примерно как это можно реализовать.
Это лишь скилет, который вы можите подогнать под свои нужды)
Удачи!
Автор: DrNemo
Сайт: http://style4web.ru/






Просмотров: 4339

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную