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

Форум PHP

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

 

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

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

тема: счетчик посетителей on-line и разделение их на гостей и авторизованных юзеров
 
 автор: elenaki   (10.01.2006 в 13:03)   письмо автору
 
 

нашла вот такой код счетчика. считает хорошо. всех, кто он-лайн.
но мне нужно всеx, кто он-лайн, разделить на гостей и авторизованных юзеров и показывать
результаты отдельно. я сделала таблицу, куда заношу юзера при авторизации с id его сессии
и временем входа, запоминаю также id юзера. а при выходе юзера - удаляю его из этой таблицы.
но если хитрый юзер не сделает logout, а просто закроет окно и уйдет, он так и останется висеть в базе. что делать?
если установить интервал 10-15-20 минут и проверять активность юзера, может получиться,
что юзер уже ушел, в числе он-лайн посетителей его нет, а из таблицы авторизованных он
еще не удалился. а если таких много будет?



//Количество минут, в течении которых пользователи считаются находящимися "он-лайн" 
$time=5; 

//Область данных, следующая строчка ОБЯЗАТЕЛЬНО должна быть шестой в этом файле 
$online='a:1:{i:0;s:43:"fa74bcdfde52735d3529e318e409f9c9|1136885759";}'; 
$online=unserialize($online); 

//Установка кодировки windows-1251 
header('Content-Type: text/html; charset=windows-1251'); 

//Окончания "числительных" 
$users = array('пользователей', 'пользователь', 'пользователя'); 

//Антикеширование 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 

//Определение внешнего и внутреннего ip-адресов 
$ip[0]=$_SERVER['REMOTE_ADDR']; 
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ip[1]=$_SERVER['HTTP_X_FORWARDED_FOR']; 
else $ip[1]=''; 

//Получаем данные броузера 
$browser=$_SERVER['HTTP_USER_AGENT']; 

//Получаем хеш из данных о пользователе 
$user=md5($ip[0].$ip[1].$browser); 

//Приделываем к хешу время последней активности 
$str=$user."|".time(); 

//В цикле "убираем" всех устаревших пользователей 

for($i=0;$i=11 && $index <= 14) 
$index = 0; 
else $index = ($index %= 10) < 5 ? ($index > 2 ? 2 : $index): 0; 
echo 'document.write(" '.$users[$index].'");'."\n"; } 

//Читаем этот файл и обновляем шестую строчку 
$file=file("online.php"); 
$file[5]='$online=\''.serialize($online).'\''.";\n"; 

//Проверяем на доступность для записи и, в случае успеха, записываем обновленные данные. 

if(is_writable("online.php")) { 
$f=fopen("online.php","w"); 
flock($f,LOCK_EX); 
fwrite($f,join("",$file)); 
flock($f,LOCK_UN); 
fclose($f); 

else { echo 'document.write("Check file permissions!");'."\n"; } 

   
 
 автор: Loki   (10.01.2006 в 13:12)   письмо автору
 
   для: elenaki   (10.01.2006 в 13:03)
 

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

   
 
 автор: elenaki   (10.01.2006 в 13:23)   письмо автору
 
   для: Loki   (10.01.2006 в 13:12)
 

не знаю, как объяснить клиенту, что нельзя обойтись без временного интервала, что сессия
закрывается не с закрытием окна браузера, а по тайм-ауту, установленному на сервере. он
уверен, что на его старом сайте (PHP_NUKE) все подсчеты происходят в ту же секунду. но как
он может видеть, что его (именно его!) сесссия закрылась и больше не участвует в подсчетах,
если он только что закрыл броузер и не может видеть счетчик на сайте??? он мне говорит -
время проверки 5 секунд (у меня было 10 минут), но что это даст? страница будет постоянно
перегружаться, "моргать"? да юзеры сбегут с нее уже через 2 секунды.

   
 
 автор: Loki   (10.01.2006 в 14:28)   письмо автору
 
   для: elenaki   (10.01.2006 в 13:23)
 

можно привязаться не к сессии, а к последнему обращению и показывать всех, кто обращался в пределах 3-5 минут - интерактивноть будет выше.

А когда я говорил о перезагрузке, я имел ввиду фрейм нулевого размера, который и будет постоянно перезагружаться обращаясь к серверу. Вроде не должно быть моргания.

   
Rambler's Top100
вверх

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