Определение пользователей 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'] – то же, но для страницы со всеми гетами и пр…
Вот примерно как это можно реализовать.
Это лишь скилет, который вы можите подогнать под свои нужды)
Удачи!
Свои замечания и предложения в комменты)
Комментариев пока нет.
Ваш отзыв
Классификатор
- JS (1)
- PHP (15)
- блогинг (4)
- Блогообзор (2)
- Веб-мастеру (10)
- интересное (18)
- Мой скрипт (10)
- Новости (12)
Теги
Поиск
Комментарии
- Konstantin к записи 370 запрещенных паролей твиттера
- Alexander к записи Постовой – плагин для WordPress
- LaaCrus к записи Старт блогообзора
- ИстинА к записи Работа с почтой средствами PHP
- Первый отчет по эксперименту с блогуном | 1000$ к записи Постовой – плагин для WordPress


