Определение пользователей 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'] – то же, но для страницы со всеми гетами и пр…

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

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

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.
Блогун - реклама в блогах. Хостинг для блогов

Поиск

 

Комментарии