Подсчет юзеров.

  • Автор темы Автор темы JAN_SOBESKI
  • Дата начала Дата начала

JAN_SOBESKI

Guest
Подсчет юзеров.

Вопрос, где можно взять пример кода, подсчитывающего количество юзеров на сайте одновременно (допустим использую сессии).
Ну или где можно увидеть что юзер вышел с сайта... т.е. как его проидентифицировать через сессию?
Вот типа как на этом форуме юзер 1 2 3 ... на форуме???
 
где можно взять пример кода
в этом форуме.
Не следует, конечно, думать, что просто нажав на кнопку поиска, сразу получишь готовый код.
Но тем не менее, при небольших трудо- и умозатратах, кучу примеров кода найти несложно.
допустим использую сессии
что значит - допустим?
Использовать сессии для подсчета юзеров на сайте - совершенно неоправданная трата ресурсов и обретение геморроя.

Форум, где сессии уже используются для авторизации - это одно. Сайт - это другое.
читай [f]na_tanke[/f] и соображай, как сделать то, что тебе надо.
 
нет ты меня не понял.
На сайте регятся юзеры, для них создаются сессии (т.е. аунтефицируются), вот этих юзеров можно как-то отслежавать.
т.е. когда юзер вошел это ноу проблем, а вот как определіть когда он вышел??????
(я думаю эта загвоздка в ссесія однако может кто подскажет где конкретней.)
 
а вот как определіть когда он вышел??????
никак.
Если бы ты прошел по ссылке, которую я дал, ты бы это узнал.
поэтому общепринятый способ - отмерять какое-то время о последнего запроса человеком сайта, и после него считать человека выбывшим.
почитай еще вот это
http://xpoint.ru/forums/programming/PHP/thread/24255.xhtml
 
Механизм сессий твоих любимых, кстати, использует тот же самый принцип.
только из-за разности задач таймаут у сессий заведомо больше.
 
Первое что нам понадобится это база данных (в моем случае это MySQL). В этой БД нам нужна таблица с двумя полями username и time
PHP:
CREATE TABLE session (
username varchar(25) DEFAULT '' NOT NULL,
time varchar(14) DEFAULT '' NOT NULL
);

Далее приступим к написанию самого скрипта, вернее одной единственной функции. Итак,

PHP:
function online() {

$username = getenv("REMOTE_ADDR");

$past = time()-900;

mysql_query("DELETE FROM session WHERE time < $past");
$result = mysql_query("SELECT time FROM session WHERE username='$username'");

$ctime = time();

if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username', '$ctime')");
}

$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];
}

Алгоритм очень прост. Идентифицируем каждого пользователя и заносим время его прихода на страницу. Определяем время, через которое пользователь будет считаться покинувшим сайт. Вот и все.
Теперь пояснения по коду. Первым делом мы получаем адрес удаленного пользователя (REMOTE_ADDR) и определяем время, через которое будем считать пользователя покинувшим сайт.
PHP:
mysql_query("DELETE FROM session WHERE time < $past");
Этой строкой удалем все просроченные записи.

$result = mysql_query("SELECT time FROM session WHERE username='$username'");
Выбираем из БД поля, для которых REMOTE_ADDR пользователя совпадает с уже зафиксированным.

if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username', '$ctime')");
}
Если такие записи в таблице есть, то обновляем, заносим новое время захода на страницу, если нет - добавляем новую запись.


$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];
Считаем из базы количество записей - это и будет количество поситителей на сайте.
 
вообще, не кошмар, конечно.
Идея-то правильная. Но реализация....
Этт ancient ипользует mysql как коробку со счетными палочками.
Лучшебы он написал пример с спользованием файлов - ему бы это было ближе

CREATE TABLE session (
ip char(15) not null primary key,
time int unsigned not null
);
PHP:
function online($timeout=180) { 
  mysql_query("DELETE FROM session WHERE time < unix_timestamp()-$timeout"); 
  mysql_query("REPLACE session VALUES ('".getenv("REMOTE_ADDR")."',unix_timestamp())"); 
  $result = mysql_query("SELECT COUNT(*) FROM session"); 
  $count = mysql_fetch_array($result); 
  return $count[0]; 
}

echo online();
Пояснения по коду.
Первым запросом удаляем, вторым - добавляем, третьим - считаем оставшихся.
 
Можно еще INET_NTOA() & INET_ATON() добавить,чтобы 15 символов на адрес не отводить. :D
 
Да, кстати.
Просто у Димы давно как-то были претензии к этим функциям.
 
Я сам это реализовать не пробовал пока что, но какие могут возникнуть проблемы (кроме поддержки старыми браузерами), если я создам iframe (маленький, 1х1, внизу страницы), в котором с промежутком в минуту будет идти запрос на скрипт подсчета посетителей сайта, говоря о том что клиент еще жив и просто очень долго читает страницу ?
 
pauk
ну и ?
если у клиента грузится страница в тот момент когда ему надо послать ежеминутное сообщение о присутствии на сайте, и именно в этот момент кто-то обновил список активных пользователей, то да, этого пользователя видно не будет. Но это очень мелкие издержки метода, и что бы этот вариант предусмотреть, чтобы определять кто уже ушел, можно вычислять пользователей от которых не приходило сообщения не минуту назад, а скажем полторы. (За пол минуты то страница должна загрузится).
 
Originally posted by Фанат
вообще, не кошмар, конечно.
Идея-то правильная. Но реализация....
Этт ancient ипользует mysql как коробку со счетными палочками.
Лучшебы он написал пример с спользованием файлов - ему бы это было ближе

CREATE TABLE session (
ip char(15) not null primary key,
time int unsigned not null
);
PHP:
function online($timeout=180) { 
  mysql_query("DELETE FROM session WHERE time < unix_timestamp()-$timeout"); 
  mysql_query("REPLACE session VALUES ('".getenv("REMOTE_ADDR")."',unix_timestamp())"); 
  $result = mysql_query("SELECT COUNT(*) FROM session"); 
  $count = mysql_fetch_array($result); 
  return $count[0]; 
}

echo online();
Пояснения по коду.
Первым запросом удаляем, вторым - добавляем, третьим - считаем оставшихся.
Спасиба
 
Tn, все твои проблемы от того, что ты уже немного подкован в технологии, но вот здравого смысла тебе не хватает.
Увеличивать трафик, городить систему трекинга посетителя, безусловно,бывает нужно.
Но, прости, только не для такой задачи, как вывод количества юзеров онлайн. Эта цифра не значит ровным счетом ничего.
Точности от нее не требуется. Способа с таймаутом хватит выше крыши.
Все-таки, тебе стоит задумываться над соответстием целей решаемым задачам.

Четырехдверная Нива - это удобно и красиво.
вот только у нее нет и десятой доли проходимости оригинальной. Не тот вес, не тот баланс, не то соотношение веса и мощности.

Ты парень неглупы, надеюсь, ты сможешь меня понять
 
Сверху