|
|
|
| нашла вот такой код счетчика. считает хорошо. всех, кто он-лайн.
но мне нужно все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"; }
|
| |
|
|
|
|
|
|
|
для: elenaki
(10.01.2006 в 13:03)
| | Так а иначе вы и не сделаете. Все так делают (хотябы даже на этом форуме). Можно, конечно, сделать по аналогии с чатом какой-нибудь скрытый фрейм, который постоянно перезагружается, но стоит ли оно того? | |
|
|
|
|
|
|
|
для: Loki
(10.01.2006 в 13:12)
| | не знаю, как объяснить клиенту, что нельзя обойтись без временного интервала, что сессия
закрывается не с закрытием окна браузера, а по тайм-ауту, установленному на сервере. он
уверен, что на его старом сайте (PHP_NUKE) все подсчеты происходят в ту же секунду. но как
он может видеть, что его (именно его!) сесссия закрылась и больше не участвует в подсчетах,
если он только что закрыл броузер и не может видеть счетчик на сайте??? он мне говорит -
время проверки 5 секунд (у меня было 10 минут), но что это даст? страница будет постоянно
перегружаться, "моргать"? да юзеры сбегут с нее уже через 2 секунды. | |
|
|
|
|
|
|
|
для: elenaki
(10.01.2006 в 13:23)
| | можно привязаться не к сессии, а к последнему обращению и показывать всех, кто обращался в пределах 3-5 минут - интерактивноть будет выше.
А когда я говорил о перезагрузке, я имел ввиду фрейм нулевого размера, который и будет постоянно перезагружаться обращаясь к серверу. Вроде не должно быть моргания. | |
|
|
|