Сколько человек на сайте
От: Shroo  
Дата: 20.04.06 21:14
Оценка:
Добрый день!
Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте.
Так обычно делают на разных форумах.
Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут.
Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди?
Большое спасибо.
Удачи.
Re: Сколько человек на сайте
От: Shroo  
Дата: 20.04.06 21:33
Оценка:
Поискал по интеу, написал что-то типа такого:

В global.asa


<SCRIPT LANGUAGE=JScript RUNAT=Server> 

function Application_OnStart()
{
  Application("users") = 0;
}

function Session_OnStart()
{
  Application("users")=Application("users")+1;
}


function Session_OnEnd()
{
  Application("users")=Application("users")-1;
}

 
</SCRIPT>



Но, кажется, так точно не посчитаешь .
Re[2]: Сколько человек на сайте
От: Shroo  
Дата: 20.04.06 21:46
Оценка:
Н-да...
Уж не знаю как он там ссесию закрывает, но через 10 минут в час ночи у меня на сайте было 58 человек .
Какая прелесть.
Re[2]: Сколько человек на сайте
От: DrZubr Беларусь  
Дата: 21.04.06 04:42
Оценка: 1 (1)
Здравствуйте, Shroo, Вы писали:

S> Поискал по интеу, написал что-то типа такого:


S>В global.asa

S>
skipped
S>


S> Но, кажется, так точно не посчитаешь .


Не скажу по поводу конкретно этой реализации, но идея парвильная: нужно считать количество сессий. Мысль в предыдущем посте по поводу IP — не самая удачная.
... << RSDN@Home 1.2.0 alpha rev. 619>>
ICQ [168117153]
Re: Сколько человек на сайте
От: ShetniX  
Дата: 21.04.06 05:37
Оценка: -3
Здравствуйте, Shroo, Вы писали:

S>Добрый день!

S>Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте.
S>Так обычно делают на разных форумах.
S>Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут.
S>Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди?
S>Большое спасибо.
S>Удачи.

Насколько я знаю у тэга <body> есть события ~ onLoad ?OnClose?. названия не помню, но есть. Я бы в них прописал кой-нить скрипт, который где-нить в файлик изменял кол-во посетителей +-1
Жизнь коротка, чтобы писать на ассемблере
Re: Сколько человек на сайте
От: W0nder  
Дата: 21.04.06 05:51
Оценка: 2 (1)
Здравствуйте, Shroo, Вы писали:

S>Что-то ума не приложу, как сдлать функцию, которая показывает сколько человек сейчас на сайте.

S>Так обычно делают на разных форумах.
S>Первое что пришло в голову — смотреть по IP кто дергается страницу, запомниать время, когда он дергнул, ну... и дальше типа: другнул — значит еще 10 минут будет тут.
S>Может кто подскажет насколько это нормальный способ, можно ли сделать по другому, и как вообще это делают люди?

Так, по-моему, обычно и делается. Или по сессии или по IP или по ID юзера (если есть) записываются в базу времена доступа.
По IP только не всегда надежно, можно делать что-нибудь типа md5($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'])
Re[2]: Сколько человек на сайте
От: DrZubr Беларусь  
Дата: 21.04.06 05:58
Оценка: 1 (1) +1 :))
Здравствуйте, ShetniX, Вы писали:

SX>Насколько я знаю у тэга <body> есть события ~ onLoad ?OnClose?. названия не помню, но есть. Я бы в них прописал кой-нить скрипт, который где-нить в файлик изменял кол-во посетителей +-1


Может иногда стоит лучше жевать чем говорить?

А если я 10 окошек браузера открою с этой страницей? Я один буду как 10 юзверей?
Плюс идея переложить чисто серверную функцию на клиентский js + 2 запроса к серверу + обработка этих запросов на сервере — полный изврат.
... << RSDN@Home 1.2.0 alpha rev. 619>>
ICQ [168117153]
Re[3]: Сколько человек на сайте
От: Shroo  
Дата: 21.04.06 10:00
Оценка:
Здравствуйте, DrZubr, Вы писали:

DZ>Здравствуйте, Shroo, Вы писали:


S>> Но, кажется, так точно не посчитаешь .


DZ>Не скажу по поводу конкретно этой реализации, но идея парвильная: нужно считать количество сессий. Мысль в предыдущем посте по поводу IP — не самая удачная.


Спасибо!
Мне самому понраилась идея.
Может кто скажет как понять когда сессия заканчивается и что было не так в коде?
Re[4]: Сколько человек на сайте
От: DrZubr Беларусь  
Дата: 21.04.06 10:41
Оценка:
Здравствуйте, Shroo, Вы писали:

S> Спасибо!

S> Мне самому понраилась идея.
S> Может кто скажет как понять когда сессия заканчивается и что было не так в коде?

Что значит "как понять когда сессия заканчивается"?
Как узнать что сессия закончилась? Сессия может закончется двумя путями: явным закрытием сессии (logout) или по тайм-ауту. В первом случае нет трудностей отнять единичку от количества пользователей, так как ты сам будешь реализовывать обработку этого запроса. А вот случай с тайм-аутом — это уже зависит от того на чем пишешь, от сервера который отвечает за хранение сессий.

Что не так с кодом? Прокомментировать не могу — не знаком как работает серверный js. Как минимум для меня в этом коде неочевидна синхронизация. Инкремент и декремент такого счетчика должны быть синхронизированными в контексте приложения.
... << RSDN@Home 1.2.0 alpha rev. 619>>
ICQ [168117153]
Re[2]: Сколько человек на сайте
От: Shroo  
Дата: 21.04.06 12:29
Оценка:
Спасибо.
Сделал именно так. С сессиями решил не морочится. Пока уже полчаса работает нормально .
Re[3]: Сколько человек на сайте
От: DrZubr Беларусь  
Дата: 21.04.06 12:59
Оценка:
Здравствуйте, Shroo, Вы писали:

S> Спасибо.

S> Сделал именно так. С сессиями решил не морочится. Пока уже полчаса работает нормально .

Угу. А теперь представь сетку из 1000 компов стоящую за одним проксиком. Много у них найдется различных юзер-агентов? А ip то у всех одинаковый будет... Так что есть реальный шанс например 500 человек посчитать за одного
... << RSDN@Home 1.2.0 alpha rev. 619>>
ICQ [168117153]
Re[4]: Сколько человек на сайте
От: Shroo  
Дата: 21.04.06 13:31
Оценка:
Здравствуйте, 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)"

есть надежда, что у многих он отличается.
Но тут не критично и ситуация, что ты описал маловерятно в моем случае. Хотя для супр-точного подсчета способ может и не подойти.
Всем спасибо за помощь.
Re: Сколько человек на сайте
От: ndef  
Дата: 21.04.06 16:35
Оценка:
Здравствуйте, 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[2]: Сколько человек на сайте
От: ndef  
Дата: 21.04.06 16:37
Оценка: 2 (1)
В предыдущем посте была небольшая неточность Это был набор функций для хранения сессий в файлах.
Это — для БД:

<?
  $SESS_LIFE = 1440;
  
  function _sess_open($save_path, $session_name)
  {
      return true;
  }
  function _sess_close()
  {
      return true;
  }
  function _sess_read($key)
  {
      $key = mysql_escape_string($key);
      $qid = db_query("select value from sessions where sesskey = '$key' and expiry > '" . time() . "'");
      $value = db_getrows($qid);
      if ($value[0]['value']) {
        return $value[0]['value'];
      }
      return false;
  }
  function _sess_write($key, $val)
  {
      global $SESS_LIFE;

      $key = mysql_escape_string($key);

      $expiry = time() + $SESS_LIFE;
      $value = mysql_escape_string($val);

      $qid = db_query("select count(*) as total from sessions where sesskey = '$key'");
      $total = db_getrows($qid);

      if ($total[0]['total'] > 0)
      {
        return db_query("update sessions set expiry = '$expiry', value = '$value' where sesskey = '$key'");
      } else
      {
        return db_query("insert into sessions values ('$key', '$expiry', '$value')");
      }
   }
   function _sess_destroy($key)
   {
      $key = mysql_escape_string($key);
      return db_query("delete from sessions where sesskey = '$key'");
   }
   function _sess_gc($maxlifetime)
   {
      db_query("delete from sessions where expiry < '" . time() . "'");
      return true;
   }
   session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
?>
Re[3]: Сколько человек на сайте
От: Shroo  
Дата: 21.04.06 22:51
Оценка:
Спасибо. Интересно.
Но уже поздно . Я уже сделал так как писал, а переделовать — не тот случай. Работает более менее точно.
Re[4]: Сколько человек на сайте
От: Аноним  
Дата: 22.04.06 08:48
Оценка:
Кстати, а чем плох способ записывания времени посещения в куку? Куку можно потом считать из ПХП-скрипта. Срок действия куки — до закрытия браузера. И всё. Не думаю, что кто-то будет специально накручивать посещения или что-то в этом вроде.Время посещения записывается куда-нибудь, рядом с уникальным ID (идентификатором сессии, IP, и т.д.). По тайм-ауту удаляем такую запись.
Re[5]: Сколько человек на сайте
От: Mamut Швеция http://dmitriid.com
Дата: 22.04.06 09:30
Оценка:
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 абсолютно одинаковых агентов
... << RSDN@Home 1.2.0 alpha rev. 647>> ... <<silent>> ...


dmitriid.comGitHubLinkedIn
Re[6]: Сколько человек на сайте
От: W0nder  
Дата: 22.04.06 13:53
Оценка:
Здравствуйте, 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'] ещё можно присобачить...
Re[7]: Сколько человек на сайте
От: Mamut Швеция http://dmitriid.com
Дата: 25.04.06 06:03
Оценка:
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'] ещё можно присобачить...


Не все прокси этот флаг ставят
... << RSDN@Home 1.2.0 alpha rev. 647>> ... <<silent>> ...


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.