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


