Эта тема на forum.dklab.ru


Ayaz: сколько человек в данный момент на сайте
Подскажите пожалуйста, как с помощью php можно узнать число находящихся на сайте в данный момент?
CTAPbIu_MABP:
можно например брать IP и сохранять в БД считая что в течении 3 минут с момента запроса последней страницы человек на сайте
можно по сессиям, если сессия активна - человек на сайте
Алканавт:

/* ф-я подсчитывает пользователей на линии; возвращает кол-во пользователей в
отформатированном виде, т.е. для вывода результата нужно лишь прописать в
нужном месте типа: echo on_line(); */
function on_line() {
$wine = 300; // точность он-лайн (секунды); время, в течении которого
// пользователя, зашедшего на страничку, мы считаем находящимся
// на сайте
$table_online = "online"; // имя таблицы
// делаем доступной глобальную переменную ИП-адреса
global $REMOTE_ADDR;
// удаляем всех, кто уже пробыл $wine секунд или у кого ИП текущий
$sql_update = "DELETE FROM $table_online WHERE `unix`+$wine < ".time().
" OR `ip` = '$REMOTE_ADDR'";
$result_update = mysql_query($sql_update) or die(mysql_error());

// вставляем свою запись
$sql_insert = "INSERT INTO $table_online VALUES ('$REMOTE_ADDR','".time()."')";
$result_insert = mysql_query($sql_insert) or die(mysql_error());

// считаем уников он-лайн
$sql_sel = "SELECT COUNT(*) FROM $table_online";
$result_sel = mysql_query($sql_sel) or die(mysql_error());

//$online_people = mysql_num_rows($result_sel); // кол-во On-Line пользователей
$online_people = mysql_fetch_array($result_sel); // кол-во On-Line пользователей

$online_people = (string) $online_people[0][0]; // приводим к строковому типу
// (так надо.. см. дальше)

$rain = strlen($online_people) - 1; // номер последнего символа в числе
// on-line юзеров

// форматирование вывода (я все сделал за вас =)
if($online_people[$rain]==2||$online_people[$rain]==3
||$online_people[$rain]==4
||(strlen($online_people)!=1&&$online_people[strlen($online_people)-2]!=1))
// $line - переменная, определяющая формат вывода
$line = "человека"; else $line = "человек";
// возвращаем результат
return "На сайте <strong>".$online_people."</strong>&nbsp;$line";
};


Соответсвенно таблица с двумя полями. Еще надо сделать сохранение IP в виде int и все бутет тип-топ )
Юрий Насретдинов:

// приводим к строковому типу
// (так надо.. см. дальше)

Не надо, strlen для чисел тоже срабатывает.

" OR `ip` = '$REMOTE_ADDR'";
А вот это я бы удалил, и сделал в базе индекс UNIQUE `ip`, так меньше нагрузка на базу будет

$result_insert = mysql_query($sql_insert) or die(mysql_error());
Ну а тут соответственно or die() не нужен, ибо этот запрос будет выдавать ошибку, если ip уже есть. Это стандартная практика


// форматирование вывода (я все сделал за вас =)
if($online_people[$rain]==2||$online_people[$rain]==3
||$online_people[$rain]==4
||(strlen($online_people)!=1&&$online_people!=1))
// $line - переменная, определяющая формат вывода
$line = "человека"; else $line = "человек";

использовали бы мою функцию declension...


$sql_sel = "SELECT COUNT(*) FROM $table_online";
$result_sel = mysql_query($sql_sel) or die(mysql_error());

//$online_people = mysql_num_rows($result_sel); // кол-во On-Line пользователей
$online_people = mysql_fetch_array($result_sel); // кол-во On-Line пользователей

$online_people = (string) $online_people[0][0];

ИМХО лучше так:


$sql_sel = "SELECT COUNT(*) as `cnt` FROM $table_online";
$res = mysql_fetch_assoc(mysql_query($sql_sel)) or die(mysql_error());
$online_people = $res['cnt']; // кол-во On-Line пользователей


полученный код ИМХО намного понятнее предыдущего.

return "На сайте <strong>".$online_people."</strong>&nbsp;$line";
Лучше ИМХО тогда уж сделать параметр - типа $format, надо ли форматировать полученную строчку, или возвращать просто число. Не всем же нужно форматирование именно в таком виде.
Миша Спларов:
global $REMOTE_ADDR;
$_SERVER['REMOTE_ADDR']

Эта тема на forum.dklab.ru