|
||||||||||||
|
||||||||||||
Счетчик на PHP |
||||
|
|
|
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
}
Вот такая простая функция, решающая большую проблему.
::::: 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. |
::::: пишет 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); |
Пример создание счетчика на PHP
<?
$counter="count.txt"; // Переменная с именем файла в котором будет происходить запись и прежде чем запускать скрипт
создайте его.
$mode=graph; // Переменная режима работы счетчика. Второе возможное значение - text
$file=fopen($counter, "r");//Открываем файл с параметром r - только чтение
if(!$file)//Проверка открыт ли файл
{
echo"[Произошла ошибка]";// Выводим сообщение об ошибке
}
else {
$num=fread($file,10); // Читаем первые 10 разрядов из открытого файла этого более чем достаточно
fclose($file); // Закрываем файл
}
$num++; //увеличиваем прочитанное значение на еденицу
$no_gaph=$num; //Присваиваем полученное значение переменной для использование в текстовом режиме
$file=fopen($counter,"w");//открываем файл на запись
fputs($file,$num);//пишем в файл новое значение
if($mode=="graph")//проверяем параметр режима, если он графический...
{
for($i=0; $i<9; $i++)//
{
$num=ereg_replace("$i","<img scr=$i.gif\ alt='$i'>",$num);//
}
echo "$num";//Выводим все теги
}else{//А если он графический...
echo" ВЫ $no_graph посетитель этой страницы";// просто выводим текстовое значение количества поситителей
}
?>
Для работы данного скрипта на сервере используются правы chmod 755,не забудьте создать файл count.txt
seo & website usability | inet | os faq | hardware faq | memory | video | cpu | hdd | mainboard faq | printer & scaner | modem | mobiles | hackzone |
po gonn © 2005 "JULI'S BEEHIVE" |
|