Пользователи онлайн
Боты: Inktomi Slurp

Гости: 7

Всего: 8


Подписаться на RSS

Модуль "Пользователи онлайн"

В догонку к запоздалой сегодняшней статье про "Облако тегов" пишу сразу вторую про создание модуля "Пользователи онлайн".

В создании данного модуля нам понадобится таблица в базе данных MySQL и для работы с этим модулем напишем класс.

Таблицу в базе данных назовем tbl_online, будет отвечать за хранение данных об online пользователях и будет она следующей структуры:

CREATE TABLE `tbl_online` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_user` int(10) unsigned NOT NULL,
`login` char(50) NOT NULL,
`isbot` enum('yes','no') NOT NULL,
`lastdate` int(10) unsigned NOT NULL,
`sid` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_DT` (`lastdate`),
KEY `IDX_SID` (`sid`),
KEY `IDX_LOGIN` (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Рассмотрим класс модуля "Пользователи онлайн":

<php
class online extends sql_db {
// construncor
function online($sqlserver, $sqluser, $sqlpassword, $database) {
$db = parent::sql_db($sqlserver, $sqluser, $sqlpassword, $database, false);
}

function listOnlineUsers($second) {
$sql = "SELECT id_user, login, isbot, count(*) as total FROM tbl_online t where lastdate>=".(time()-$second)." group by login;";
parent::sql_query($sql);
$rowset = parent::sql_fetchrowset();
if (!empty($rowset) and count($rowset)>0) {
$result = array();
foreach ($rowset as $row) {
if ($row['isbot'] == "yes")
$result['bot'][] = $row;
else if ($row['login'] == "guest")
$result['guest'] = $row;
else
$result['user'][] = $row;
}
return $result;
}
else
return false;
}

function isBot() {
$bots = array(
);

$userAgent = $_SERVER['HTTP_USER_AGENT'];

foreach($bots as $key => $value) {
if(strstr(strtolower($userAgent), strtolower($key))) {
$bot = $value;
}
}

return (isset($bot)? $bot: "");
}

function onlineUserUpdate($cid) {
$sql = "select count(*) as total from tbl_online where sid='{$cid}'";
parent::sql_query($sql);
$total = parent::sql_fetchrow();

if ($total['total'] > 0) {
$sql = "update tbl_online set lastdate=".time().(isset($_SESSION['auth']) && $_SESSION['auth']==1? ", login='".addslashes($_SESSION['name'])."'": ", login='guest'")." where sid='{$cid}'";
parent::sql_query($sql);
}
else {
if (isset($_SESSION['auth']) && $_SESSION['auth']==1) {
$login = $_SESSION['name'];
$id_user = $_SESSION['id'];
$isbot = 'no';
}
else {
$result = $this->isbot();
if ($result != "") {
$login = $result;
$id_user = 0;
$isbot = 'yes';
}
else {
$login = "guest";
$id_user = 0;
$isbot = 'no';
}
}

$sql = "insert into tbl_online (login, isbot, lastdate, sid, id_user) VALUES ('".addslashes($login)."', '{$isbot}', ".time().", '{$cid}', {$id_user});";
parent::sql_query($sql);
}
}

function offlineUserDelete($second) {
$sql = "delete from tbl_online where lastdate<".(time()-$second);
parent::sql_query($sql);
}
}
?>

Наш новый класс online наследует свойства класса работы с базой данных sql_db. В классе несколько методов:

listOnlineUsers($second) - Возвращает список пользователей/ботов, которые были на сайте за последние $second секунд

isBot() - определение является ли данный пользователь ботом. Тут видите, что массив $bots не заполнен, просто удалил, а то много информации, полный класс можете скачать по ссылке, расположенной в конце статьи

onlineUserUpdate($cid) - обновление информации о пользователе, каждый пользователь посредством сессии получает Session ID, который используется его его идентификации. Предполагается, что изначально активизирована сессия, в ней есть элемент auth, который принимает значение 1, в случае если пользователь авторизирован на Вашем сайте. id и name - это ID и LOGIN пользователя, который активизирован в Вашей системе.

offlineUserDelete($second) - собственно метод удаления пользователей из базы активных, если они не были на сайте больше $second секунд

Итак, чтобы воспользоваться данным классом, напишем следующий код:

<php
$seconds = 300; // 5 минут
session_start();
$sid = session_id();
$online = new online($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
$online->offlineUserDelete($seconds);
$online->onlineUserUpdate($sid);
$usersOnline = $online->listOnlineUsers($seconds);
?>

Во-второй строке мы инициализируем сессию, а в третьей получаем SID (Session ID). Далее используя данные для подключения к базе данных мы создаем новую переменную из класса online. 5 строка отвечает за удаление неактивных пользователей из таблицы online пользователей. Далее обновляем текущему пользователю состояние активности. И последней строчкой кода мы выбираем из базы активных пользователей, которые находились на сайте в течении последних 5 минут.

И самое последнее, но самое главное - это вывод блока на странице

<php if (isset($modules['online']['user'])) {
$result .= ' Пользователи online:'." ";
foreach ($modules['online']['user'] as $key=>$user) {
$result .= "<a href="/user/{$user['id_user']}" class="online">".$user['login']."</a>".($key!=count($modules['online']['user'])-1? ", ": "");
}
$result .= '

';
}

if (isset($modules['online']['bot'])) {
$result .= ' Боты: '." ";
foreach ($modules['online']['bot'] as $key=>$user) {
$result .= $user['login'].($key!=count($modules['online']['bot'])-1? ", ": "");
}
$result .= '

';
}

if (isset($modules['online']['guest'])) {
$result .= ' Гости: '.$modules['online']['guest']['total']." ";
$result .= '

';
}

$result .= ' Всего: '.((isset($modules['online']['user'])? count($modules['online']['user']): 0)+(isset($modules['online']['bot'])? count($modules['online']['bot']): 0)+@$modules['online']['guest']['total'])." ";
?>

Скачать модуль: "http://phpprogs.ru/uploads/onlineUsers20100604.zip;"

Отвечу на любые вопросы.

zer0, 07.06.2010 17:12:04

Может Вы еще напишите модуль для регистрации и авторизации пользователей у себя на сайте. А так же было бы не плохо, пример скрипта аккаунта пользователя!!! спасибо!

programmer, 08.06.2010 13:05:38

Это всё будет в цикле статей об написании CMS 



Отвечу на вопросы по PHP

vetal, 08.06.2010 16:11:19

Спасибо за скрипты. Только чевото не выходит внедрить в свой двиг. В коде вывода блока на страницу, выскакивает ошибка: syntax error, unexpected '{' , в четвертой строке. И куда этот код с $seconds вставлять, на всех страницах?

programmer, 08.06.2010 16:23:48

Внизу статьи есть ссылка на архив со скриптом, скачайте его, он точно работает.

Вам необходимо изначально сделать include класса по работе с MySQL. $second Вы можете вынесли в свойства класса и тогда его не надо передавать в скриптах, т.е. сделать типа такого:

class online extends sql_db {
var $second = 30;

...

А из параметров методов класса убрать $second, а в самих методах вместо $second поставить $this->second



Отвечу на вопросы по PHP

mikx, 11.07.2010 01:09:19

Я почти ноль в php

что такое это $modules['online']['user'];?

и можно ли создать архив модуля со всеми классами вместе.?

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться