Добрый день!
Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте.
Так обычно делают на разных форумах.
Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут.
Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди?
Большое спасибо.
Удачи.
Здравствуйте, Shroo, Вы писали:
S> Поискал по интеу, написал что-то типа такого:
S>В global.asa S>
skipped
S>
S> Но, кажется, так точно не посчитаешь .
Не скажу по поводу конкретно этой реализации, но идея парвильная: нужно считать количество сессий. Мысль в предыдущем посте по поводу IP — не самая удачная.
Здравствуйте, Shroo, Вы писали:
S>Добрый день! S>Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте. S>Так обычно делают на разных форумах. S>Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут. S>Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди? S>Большое спасибо. S>Удачи.
Насколько я знаю у тэга <body> есть события ~ onLoad ?OnClose?. названия не помню, но есть. Я бы в них прописал кой-нить скрипт, который где-нить в файлик изменял кол-во посетителей +-1
Здравствуйте, Shroo, Вы писали:
S>Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте. S>Так обычно делают на разных форумах. S>Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут. S>Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди?
Так, по-моему, обычно и делается. Или по сессии или по IP или по ID юзера (если есть) записываются в базу времена доступа.
По IP только не всегда надежно, можно делать что-нибудь типа md5($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'])
Здравствуйте, ShetniX, Вы писали:
SX>Насколько я знаю у тэга <body> есть события ~ onLoad ?OnClose?. названия не помню, но есть. Я бы в них прописал кой-нить скрипт, который где-нить в файлик изменял кол-во посетителей +-1
Может иногда стоит лучше жевать чем говорить?
А если я 10 окошек браузера открою с этой страницей? Я один буду как 10 юзверей?
Плюс идея переложить чисто серверную функцию на клиентский js + 2 запроса к серверу + обработка этих запросов на сервере — полный изврат.
Здравствуйте, DrZubr, Вы писали:
DZ>Здравствуйте, Shroo, Вы писали:
S>> Но, кажется, так точно не посчитаешь .
DZ>Не скажу по поводу конкретно этой реализации, но идея парвильная: нужно считать количество сессий. Мысль в предыдущем посте по поводу IP — не самая удачная.
Спасибо!
Мне самому понраилась идея.
Может кто скажет как понять когда сессия заканчивается и что было не так в коде?
Здравствуйте, Shroo, Вы писали:
S> Спасибо! S> Мне самому понраилась идея. S> Может кто скажет как понять когда сессия заканчивается и что было не так в коде?
Что значит "как понять когда сессия заканчивается"?
Как узнать что сессия закончилась? Сессия может закончется двумя путями: явным закрытием сессии (logout) или по тайм-ауту. В первом случае нет трудностей отнять единичку от количества пользователей, так как ты сам будешь реализовывать обработку этого запроса. А вот случай с тайм-аутом — это уже зависит от того на чем пишешь, от сервера который отвечает за хранение сессий.
Что не так с кодом? Прокомментировать не могу — не знаком как работает серверный js. Как минимум для меня в этом коде неочевидна синхронизация. Инкремент и декремент такого счетчика должны быть синхронизированными в контексте приложения.
Здравствуйте, Shroo, Вы писали:
S> Спасибо. S> Сделал именно так. С сессиями решил не морочится. Пока уже полчаса работает нормально .
Угу. А теперь представь сетку из 1000 компов стоящую за одним проксиком. Много у них найдется различных юзер-агентов? А ip то у всех одинаковый будет... Так что есть реальный шанс например 500 человек посчитать за одного
Здравствуйте, DrZubr, Вы писали:
DZ>Здравствуйте, Shroo, Вы писали:
S>> Спасибо. S>> Сделал именно так. С сессиями решил не морочится. Пока уже полчаса работает нормально .
DZ>Угу. А теперь представь сетку из 1000 компов стоящую за одним проксиком. Много у них найдется различных юзер-агентов? А ip то у всех одинаковый будет... Так что есть реальный шанс например 500 человек посчитать за одного
Да, я понимаю .
У меню Юзверь агент, например выглядит примерно так:
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.3 (build 01218); .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
есть надежда, что у многих он отличается.
Но тут не критично и ситуация, что ты описал маловерятно в моем случае. Хотя для супр-точного подсчета способ может и не подойти.
Всем спасибо за помощь.
Здравствуйте, Shroo, Вы писали:
S>Добрый день! S>Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте. S>Так обычно делают на разных форумах. S>Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут. S>Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди? S>Большое спасибо. S>Удачи.
Все делается очень просто — нужно хранить сессии в базе. Потом просто считаешь сколько записей находится в таблице, конечно с учетом время жизни сессии. Вот набор функций, которые это позволяют делать (взято из PHP мануала):
<?php
function open($save_path, $session_name)
{
global $sess_save_path, $sess_session_name;
$sess_save_path = $save_path;
$sess_session_name = $session_name;
return(true);
}
function close()
{
return(true);
}
function read($id)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "r")) {
$sess_data = fread($fp, filesize($sess_file));
return($sess_data);
} else {
return(""); // Must return "" here.
}
}
function write($id, $sess_data)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
return(fwrite($fp, $sess_data));
} else {
return(false);
}
}
function destroy($id)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
/*********************************************
* WARNING - You will need to implement some *
* sort of garbage collection routine here. *
*********************************************/function gc($maxlifetime)
{
return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
// proceed to use sessions normally
?>
Спасибо. Интересно.
Но уже поздно . Я уже сделал так как писал, а переделовать — не тот случай. Работает более менее точно.
Re[4]: Сколько человек на сайте
От:
Аноним
Дата:
22.04.06 08:48
Оценка:
Кстати, а чем плох способ записывания времени посещения в куку? Куку можно потом считать из ПХП-скрипта. Срок действия куки — до закрытия браузера. И всё. Не думаю, что кто-то будет специально накручивать посещения или что-то в этом вроде.Время посещения записывается куда-нибудь, рядом с уникальным ID (идентификатором сессии, IP, и т.д.). По тайм-ауту удаляем такую запись.
S> "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.3 (build 01218); .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
S> есть надежда, что у многих он отличается.
Нет такой надежды. Любое интернет-кафе даст тебе 10-200 абсолютно одинаковых агентов
Здравствуйте, Mamut, Вы писали:
S>> "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.3 (build 01218); .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
S>> есть надежда, что у многих он отличается.
M>Нет такой надежды. Любое интернет-кафе даст тебе 10-200 абсолютно одинаковых агентов
$_SERVER['HTTP_X_FORWARDED_FOR'] ещё можно присобачить...
S>>> "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.3 (build 01218); .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
S>>> есть надежда, что у многих он отличается.
M>>Нет такой надежды. Любое интернет-кафе даст тебе 10-200 абсолютно одинаковых агентов
W>$_SERVER['HTTP_X_FORWARDED_FOR'] ещё можно присобачить...