WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Сколько человек на сайте??


Прислал: Tankist [ 01.02.2002 @ 12:33 ]
Раздел:: [ Статьи по PHP ]


Недавно на webscript.ru была опубликована статья Сколько человек на сайте?, однако у нее был один недостаток: она определяла пользователя по IP. Почему этот метод плохой? Давайте подумаем:

1. Некоторые провайдеры обязывают свои клиентов пользоваться прокси-серверами, а теперь подумайте: что останется в переменной REMOTE_ADDR? Правильно: адрес прокси-сервера! А если на сайт зайдут несколько пользователей одного провайдера, скрипт будет думать что это один и тот же юзер.

2. Некоторые провайдеры, которые предоставляют доступ по кабельным сетям, время от времени меняют IP-адреса пользователей.

К сожалению, когда Тим Бернерс Ли в 91 году разрабатывал протокол HTTP, он хотел сделать его очень быстрым, поэтому удалил всю информацию о состоянии, чем прибавил работы веб-разработчикам.
Итак, от слов к делу..
Что нам понадобится для работы:
1. База данных mysql
2. PHP4
Создадим таблицу www_online:
CREATE TABLE www_online (
hid int(11) NOT NULL auto_increment,
sess_id char(255) NOT NULL default '',
last_time char(255) NOT NULL default '',
PRIMARY KEY (hid)
) TYPE=MyISAM;

В этой базе мы будем хранить соответственно:
Hid – ID, просто так?
Sess_id – ID сессии пользователя
Last_time – Время последней активности пользователя в секундах с начала эпохи (1970 г.).
Теперь код функции:

function show_online_user() {
global $database; //Импортируем массив с данными mysql
session_start(); //Начинаем сессию
session_set_cookie_params("0"); //Задаем время жизни куки
$id=session_id(); $time=time(); $past=time()-500; //Переменные(id - id сессии, time-текущее время,
past-время, после которого надо удалять сессии).
$link=mysql_connect($database[dbserv], $database[dbuser], $database[dbpass]); //Коннектимся к базе данных
mysql_select_db($database[dbname]); //Выбираем базу данных
mysql_query("DELETE FROM www_online WHERE last_time < '$past'"); //Удаляем старые сессии
$result=mysql_query("SELECT last_time FROM www_online WHERE sess_id='$id'"); //Выбираем таблицу
$rows=mysql_num_rows($result); //Если в таблице есть sess_id с $id, то равно 1, иначе 0
if ($rows!="0") {
mysql_query("UPDATE www_online SET last_time='$time' WHERE sess_id='$id'");
} else {
mysql_query("INSERT INTO www_online (last_time, sess_id) VALUES ('$time', '$id')");
}
$result = mysql_query("SELECT * FROM www_online"); //Выбираем все сессии
$count = mysql_num_rows($result); //Считаем число сессий
return "Сейчас на сайте $count человек(а)"; //Возвращаем число юзеров
mysql_close($link); //Закрываем коннект с mysql
}
Вот такая простая функция, решающая большую проблему.

Действие фунции можете посмотреть на развивающемся игровом портале //lreal.km.ru.
-------------------- С уважением, Смирнов Никита aka Tankist
lreal@km.ru icq: 147106412
//lreal.km.ru


 :::::  Mika Turin пишет 07.02.2002 @ 12:08 
Kak i pervij tak i vtoroj variant ne daet polnuju tochnostj pri podschete kolichestva poljzovatelej na saite. V pervom daet oshibku IP. A vo vtorom, "cookie", tak kak ispoljzovanie "cookies" vkljucheno ne vo vseh browserah. Posetitili s otkluchenimu kykami budut ne vidni dlja etoj sistemi.

P.S. kak priviljno shitatj sam eche ne pridulal, no shitatj nado i po IP i po cookies.
 :::::  duncan пишет 07.02.2002 @ 12:52 
а какой смысл хранить $time в char(255)?
когда для этого есть тип int, да и выборка в этом случае будет на порядок быстрее.

А вообще считать посетителей онлайн это дело неблагодарное,
с таким же успехом можно выводить просто случайное число :)))) Точность та же
 :::::  Tankist пишет 07.02.2002 @ 17:32 
duncan:)
По поводу mysql: не придерайся:)
Случайное число?Типа 13243545?:))
 :::::  BarmaLINI пишет 08.02.2002 @ 11:14 
По поводу REMOTE_ADDR, вот кусочек кода с моего портала
работает без проблем за прокси :о) (разве что прокси закрытыми бывают - запрет определения локального адреса)

if ($HTTP_X_FORWARDED_FOR != "" )
{
$pip = $HTTP_X_FORWARDED_FOR;
$phost = @gethostbyaddr($HTTP_X_FORWARDED_FOR);
$ip = $REMOTE_ADDR;
$host = @gethostbyaddr($REMOTE_ADDR);
}
else
{
$pip = "";
$phost = "";
$ip = $REMOTE_ADDR;
$host = @gethostbyaddr($REMOTE_ADDR);
}

 :::::  Tankist пишет 09.02.2002 @ 22:59 
session_set_cookie_params("0");
-
надо так:
session_set_cookie_params(time()+3600);
 :::::  ECTb пишет 19.02.2002 @ 22:59 
2BarmaLINI: HTTP_X_FORWARDED_FOR, как и HTTP_VIA_PROXY вообще лучше не трогать! ;) т.к. в эти переменные можно запихнуть все что угодно, можно запихнуть туда чужой IP, а можно и текст любой.
 :::::  laacz пишет 20.03.2002 @ 22:02 
Neponatno, pochemu delat` tormoz:

$result = mysql_query("SELECT * FROM www_online"); //Выбираем все сессии
$count = mysql_num_rows($result); //Считаем число сессий

Nado li zagruzat' bazu dannyh, zastvalyaya selektit' vsje zapisi? Jesli bystree budet

$count = mysql_result(mysql_query("SELECT COUNT(hid) FROM www_online"), 0);
 :::::  Ruslan пишет 16.01.2003 @ 17:48 
А почему вы не хотите использовать вместо кукисов работу с сессиями в пхп очень хорошая вещь ???
 :::::  Rackot пишет 29.11.2006 @ 06:25 
Способ имеет существенный недостаток. Если юзер откроет новое окно со страничкой сайта - то будет создана новая сессия... То есть количество посетителей увеличится еще на 1 человека. А если 10 юзеров откроют 10 страниц сайта?

Вобщем что подсчет по IP, что подсчет по сессиям - оба имеют серьезные погрешности. А идеального решения к сожалению нет.
 :::::  S2me пишет 08.12.2006 @ 13:15 
Есть более точный способ... учитывать юзеров по ID браузера. Есть такой параметр типа серийника, который в каждом браузере уникален. в инете даже есть скрипты чтобы сайт мог получать этот номер. На этом принципе работает бан по браузеру в чатах на движке SPB.
Вероятность, что юзер откроет один и тот-же сайт в двух разных браузерах ничтожно мала. (разве что специально).
 :::::  Serge пишет 27.04.2007 @ 15:48 
<< session_start(); //Начинаем сессию
<< session_set_cookie_params("0"); //Задаем время жизни куки

Вообще-то session_set_cookie_params() должна вызываться перед session_start() а не после.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0181940