Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчитать количество пользователей, находящихся на сайте?
 
 автор: Настя   (10.01.2006 в 20:12)
 
 

Правильно ли я понимаю, что нужно в каждую страницу (на которой мы хотим учитывать пользователя как находящегося на сайте) вставить код, который будет:

1. определять ай-пи пользователя
2. записывать/перезаписывать (если уже был записан) его ай-пи + когда сделана запись
3. проверять все записи и удалять все, которые, допустим, старше 10 минут

Это правильно?
Есть ли другие способы подсчитать количество пользователей, находящихся на сайте?

Я боюсь, что это может сильно нагружать сайт. Если учесть, что иногда (по моим прикидкам), на сайте идет до 100 загрузок страниц в минуту, и в каждой будет этот доп. код. Или не стоит этого опасаться?

   
 
 автор: cheops   (10.01.2006 в 20:31)   письмо автору
 
   для: Настя   (10.01.2006 в 20:12)
 

1) Обычно используют не IP-адрес пользователя, а сессию...

>Это правильно?
Да всё правильно.

>Есть ли другие способы подсчитать количество пользователей,
>находящихся на сайте?
Можно анализировать журнальные файлы Web-сервера (log-файлы), если они вам доступны. Ведь сервер всё равно эту работу осуществляет.

>Я боюсь, что это может сильно нагружать сайт. Если учесть,
>что иногда (по моим прикидкам), на сайте идет до 100
>загрузок страниц в минуту, и в каждой будет этот доп. код.
>Или не стоит этого опасаться?
В принципе может, но 100 хитов в минуту - это не так много, скорее всего никаких задержек не будет.

   
 
 автор: Настя   (10.01.2006 в 20:58)
 
   для: cheops   (10.01.2006 в 20:31)
 

А чем сессия лучше ай-пи в данном случае?

   
 
 автор: Loki   (10.01.2006 в 21:01)   письмо автору
 
   для: Настя   (10.01.2006 в 20:58)
 

Тем что о сроке ее жизни беспокоится сам сервер. Ну и кроме того она, вероятно, все равно вам потребуется если вы планируете делать, например, авторизацию.

   
 
 автор: cheops   (10.01.2006 в 22:19)   письмо автору
 
   для: Настя   (10.01.2006 в 20:58)
 

Из под одного IP-адреса сайт может посещать множество человек - для каждого из них сессия будет уникальна, а IP-адрес - нет.

   
 
 автор: Loki   (10.01.2006 в 22:32)   письмо автору
 
   для: cheops   (10.01.2006 в 22:19)
 

... и наоборот: один пользователь может в течение сессии несколько раз подключаться с разных ip (dial-up)

   
 
 автор: DDK   (10.01.2006 в 22:52)   письмо автору
 
   для: Настя   (10.01.2006 в 20:12)
 

Вот, изучите такой пример (вырезал из своей CMS):

<?
############ WHOSEONLINE FUNCTION START ######
if(isset($_SESSION['username'])) {
    
$thisusername $_SESSION['username'];
    
$nowtime time();
    
$query "DELETE FROM $whoseonlinetable WHERE userip='$REMOTE_ADDR'";
    
mysql_query($query);
    
$query "INSERT INTO $whoseonlinetable (username, isreg, userip, lastactivitytime) VALUES ('$thisusername', '1', '$REMOTE_ADDR', '$nowtime')";
    
mysql_query($query);
    
$query "UPDATE st_users SET lastvisit='$nowtime' WHERE username='".mysql_escape_string($thisusername)."'";
    
mysql_query($query);
} else {
    
$nowtime time();
    
$query "DELETE FROM $whoseonlinetable WHERE userip='$REMOTE_ADDR'";
    
mysql_query($query);
    
$query "INSERT INTO $whoseonlinetable (username, isreg, userip, lastactivitytime) VALUES ('guestuser', '0', '$REMOTE_ADDR', '$nowtime')";
    
mysql_query($query);
}
// online-bits
$usersonlinebits "";
$remainingtime time() - 300;
$query "DELETE FROM $whoseonlinetable WHERE lastactivitytime<$remainingtime"
mysql_query($query);
$onlineusersquery "SELECT * FROM $whoseonlinetable ORDER BY username ASC";
$onlineusersresult mysql_query($onlineusersquery);
$onlineuserscount mysql_numrows($onlineusersresult);
if(
$onlineuserscount != 0) {
    while(
$onlineuser mysql_fetch_array($onlineusersresult)) {
        if(
$onlineuser['username'] != "guestuser") {
            
$onlineusersarray[] = $onlineuser['username'];
        } else {
            
$onlineguestsarray[] = $onlineuser['username'];
        }
    }
    if(!isset(
$onlineusersarray)) {$oucount 0;} else {$oucount count($onlineusersarray);}
    if(!isset(
$onlineguestsarray)) {$ogcount 0;} else {$ogcount count($onlineguestsarray);}
    
$usersonlinebits .= "<font class='header-11px-normal'>";
    
$usersonlinebits .= "<a href='#' onclick=\"window.open('/showusersonline.php', '_blank', 'toolbar=0, scrollbars=1, location=0, menubar=0, width=440, height=400');\"><font style='text-decoration: underline;'>Сейчас на сайте</font></a>: ".$oucount." участников и ".$ogcount." гостей.";
    
$usersonlinebits .= "</font>";
}
$page_code str_replace("[%online_bits%]"$usersonlinebits$page_code);
############ WHOSEONLINE FUNCTION END ########
?>

   
 
 автор: cheops   (11.01.2006 в 00:13)   письмо автору
 
   для: DDK   (10.01.2006 в 22:52)
 

Не плохо бы к нему приложить структуру таблицы базы данных - иначе тяжело воспринимается.

   
 
 автор: elenaki   (11.01.2006 в 09:09)   письмо автору
 
   для: cheops   (11.01.2006 в 00:13)
 

тяжело воспринимаются длиннющие имена переменных без разделения слов. прямо пример
к вашей книге - о том, как не надо называть переменные и функции :)
а структура таблицы видна в запросе insert.

   
 
 автор: cheops   (11.01.2006 в 13:40)   письмо автору
 
   для: elenaki   (11.01.2006 в 09:09)
 

Короткие переменные тоже плохо, но в циклах согласен, традиционно используются односимвольные индексы - так как программисты привыкли воспринимать информацию именно в таком виде.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования