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

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

JAN_SOBESKI

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

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

Фанат

oncle terrible
Команда форума
где можно взять пример кода
в этом форуме.
Не следует, конечно, думать, что просто нажав на кнопку поиска, сразу получишь готовый код.
Но тем не менее, при небольших трудо- и умозатратах, кучу примеров кода найти несложно.
допустим использую сессии
что значит - допустим?
Использовать сессии для подсчета юзеров на сайте - совершенно неоправданная трата ресурсов и обретение геморроя.

Форум, где сессии уже используются для авторизации - это одно. Сайт - это другое.
читай [f]na_tanke[/f] и соображай, как сделать то, что тебе надо.
 

JAN_SOBESKI

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

Фанат

oncle terrible
Команда форума
а вот как определіть когда он вышел??????
никак.
Если бы ты прошел по ссылке, которую я дал, ты бы это узнал.
поэтому общепринятый способ - отмерять какое-то время о последнего запроса человеком сайта, и после него считать человека выбывшим.
почитай еще вот это
http://xpoint.ru/forums/programming/PHP/thread/24255.xhtml
 

Фанат

oncle terrible
Команда форума
Механизм сессий твоих любимых, кстати, использует тот же самый принцип.
только из-за разности задач таймаут у сессий заведомо больше.
 

pauk

Новичок
Первое что нам понадобится это база данных (в моем случае это 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];
Считаем из базы количество записей - это и будет количество поситителей на сайте.
 

Фанат

oncle terrible
Команда форума
вообще, не кошмар, конечно.
Идея-то правильная. Но реализация....
Этт 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();
Пояснения по коду.
Первым запросом удаляем, вторым - добавляем, третьим - считаем оставшихся.
 

Alex2003

Новичок
Можно еще INET_NTOA() & INET_ATON() добавить,чтобы 15 символов на адрес не отводить. :D
 

Фанат

oncle terrible
Команда форума
Да, кстати.
Просто у Димы давно как-то были претензии к этим функциям.
 

Tn

Guest
Я сам это реализовать не пробовал пока что, но какие могут возникнуть проблемы (кроме поддержки старыми браузерами), если я создам iframe (маленький, 1х1, внизу страницы), в котором с промежутком в минуту будет идти запрос на скрипт подсчета посетителей сайта, говоря о том что клиент еще жив и просто очень долго читает страницу ?
 

pauk

Новичок
Tn
а если у клиента в это время страница грузится?
 

Tn

Guest
pauk
ну и ?
если у клиента грузится страница в тот момент когда ему надо послать ежеминутное сообщение о присутствии на сайте, и именно в этот момент кто-то обновил список активных пользователей, то да, этого пользователя видно не будет. Но это очень мелкие издержки метода, и что бы этот вариант предусмотреть, чтобы определять кто уже ушел, можно вычислять пользователей от которых не приходило сообщения не минуту назад, а скажем полторы. (За пол минуты то страница должна загрузится).
 

JAN_SOBESKI

Guest
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();
Пояснения по коду.
Первым запросом удаляем, вторым - добавляем, третьим - считаем оставшихся.
Спасиба
 

Фанат

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

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

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