RTFM! статьи, советы, скрипты
::Заработок с помощью сайта ::JScript по-русски! ::Все русские мануалы::
МЕНЮ
О САЙТЕ
НОВОСТИ
СТАТЬИ
КНИГИ
АППЛЕТЫ
СВЯЗЬ

СЧЕТЧИКИ
Rambler's Top100
Рейтинг@Mail.ru
Яндекс цитирования

Разработка собственного счетчика

Автор: Анастасия КОВАЛЕВА Сайт: http://www.mycomp.com.ua/     Рейтинг: N/A из 7       <<НАЗАД
   
   Начнем с «собирательной» части, чьей задачей, помимо сбора данных, является сохранение их в определенном формате. Как уже говорилось, обычно данные сохраняются в базах данных, что обеспечивает более быструю и легкую обработку информации по сравнению с хранением статистики в файле. Выбрав базы данных на первом этапе разработки нашего счетчика, мы легко реализуем вторую, «анализирующую» часть. Мы будем работать с самыми распространенными в вебе базами данных — MySQL. Средств для сбора информации достаточно много (часть данных можно собрать с помощью «клиентских» языков Javascript или VBscript, или же использовать только серверные языки PHP, Perl, ASP, Java) — чтобы не путаться, мы сравним возможности PHP и Javascript. Вам может показаться, что для того чтобы создавать все необходимые отчеты, которые мы перечислили в первой части статьи, понадобится собрать огромное количество информации, но это совсем не так. Нам нужно лишь определить, кто зашел на сайт, какую страницу просматривает, когда это происходит, откуда посетитель пришел на эту страницу и чем пользуется при просмотре. Также лучше сохранить идентификатор сеанса пользователя, чтобы легко выделять отдельных посетителей. Перечисленных данных вполне хватит для того, чтобы генерировать все необходимые отчеты. Распишем каждый из собираемых параметров.
   
   1. Кто зашел на сайт. Записываем IP-адрес пользователя. Чтобы его получить, с помощью PHP получаем переменную окружения, которая указывает IP посетителя. Это можно сделать с помощью функции getenv ("REMOTE_ADDR"). К сожалению, Javascript’ом IP пользователя получить никак нельзя. Придется подключить средства серверного языка.
   
   2. Какую страницу просматривает. В PHP вы можете получить глобальную переменную $_SERVER['PHP_SELF'], которая указывает на ту страницу, в которой был вызван счетчик. Также придется использовать $_SERVER['QUERY_STRING'], чтобы не упустить адреса с параметрами передачи скрипту переменных (например, ?id=2033451&sec=23). Что касается Javascript’а, здесь вы можете использовать объект location.href или же document.URL или document.location.
   
   3. Время. В PHP можно получить несколькими способами. Самый простой — функция date(). Ей передаются параметры, определяющие формат возвращаемого значения. Например, date(“YmdHis”) выдаст дату в формате год-месяц-день-час-минуты-секунды. Для аналогичных целей в Javascript нужно создать объект Date c параметрами: var MyDate=new Date(yy,mm,dd,hh,mm,ss).
   
   4. Откуда пришел посетитель. Этот параметр называется Referrer. В PHP можно получить через глобальную переменную $_SERVER['HTTP_REFERER']. Javascript имеет свой эквивалент — свойство referrer для объекта document (document.referrer).
   
   5. С помощью чего посетитель просматривает страницу. Под этим подразумевается операционная система и браузер, которыми пользуется посетитель. Данные параметры легко получить из значения UserAgent, которые выглядят, например, так: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) или Opera/6.05 (Windows 98; U) [ru]. Кстати, именно по UserAgent можно определять, пришел ли на сайт поисковик, или это нормальный посетитель. Например, для Rambler’а параметр UserAgent будет StackRambler/2.0, а для Яндекса — Yandex/1.01.001 (compatible; Win16; I). Для получения UserAgent в PHP используем конструкцию getenv("HTTP_USER_AGENT"). В Javascript можем воспользоваться объектом navigator (navigator.userAgent). Если вы захотите знать другие параметры о пользователе, например экранное расширение, включены ли Java, cookie, то придется добавить дополнительные поля в базу данных. Многие значения можно получить из Javascript-объекта navigator, а также из объекта windows. В PHP можно воспользоваться функцией get_browser(), которая выдает массив значений, аналогичных тем, что хранятся в объекте navigator.
   
   6. Идентификатор сеанса. Он нужен для того, чтобы отслеживать перемещения по сайту одного пользователя. В PHP можете реализовать сеанс пользователя с помощью сессии. Делаем session_start(), и на каждой странице получаем идентификатор функцией session_id(). Вместо сессий можно воспользоваться cookie, если они разрешены у пользователя. Кстати, сеанс пользователя с cookie можно реализовать как на PHP, так и на Javascript.
   
   Как видно, мы можем обойтись всего шестью параметрами, чтобы собрать информацию о посетителе. Создадим соответствующую таблицу в базе данных MySQL, для чего выполним такой запрос:
   
   CREATE TABLE `stat` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `uip` char(20) default NULL,
    `referer` char(255) default NULL,
    `self` char(255) default NULL,
    `dat` timestamp(14) NOT NULL,
    `sid` char(36) default NULL,
    `agent` char(255) default NULL,
    PRIMARY KEY (`id`),
    KEY `id` (`id`)
   ) TYPE=MyISAM;
   
   Код получения и сохранения данных на PHP приведен ниже. Его нужно вставить в начало каждой страницы вашего сайта. В переменные $server, $user, $password и $database впишите ваши параметры для базы данных MySQL.
   
   <?
   session_start(); //Загружаем сеанс пользователя
   $sid=session_id(); //Получаем идентификатор сессии
   if ($_SERVER['QUERY_STRING']!='') //Получаем адрес страницы
    $self='www.mysite.com'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
   else $self='www.mysite.com'.$_SERVER['PHP_SELF'];
   $addr=getenv("REMOTE_ADDR"); //Получаем IP пользователя
   $today = date("YmdHis"); //Получаем текущую дату
   $ag=getenv("HTTP_USER_AGENT"); //Получаем агента пользователя
   $sql="insert into stat(uip,referer,self,dat,sid,agent) values //Составляет запрос для записи данных
   ('$addr','".$_SERVER['HTTP_REFERER']."','$self','$today','$sid','$ag')";
   $cid=mysql_connect($server, $user, $password ); //устанавливаем соединение с БД
   mysql_select_db($database); //выбираем таблицу для работы
   mysql_query( $sql,$cid); //выполняем запрос
   ?>
   
   Собирательная часть готова, можно переходить к самой обработке статистики. Теперь мы оказываемся перед лицом главной нашей задачи — реализовать правильные SQL-запросы для выборки нужных данных. Формирование всех отчетов мы в статье рассмотреть не сможем, поэтому остановимся на некоторых самых интересных.
   
   Давайте, например, получим все хосты (уникальные IP) и хиты за сегодняшний день:
   
   $cur_date=date("Ymd").'000000';
   $sql=”select count(distinct(uip)),count(uip) from stat where dat>=”.$cur_date;
   $res=mysql_query($sql,$cid);
   $row=mysql_fetch_array($res);
   echo “Хиты: ”.$row[1].” Хосты: “.$row[0];
   
   Сделаю несколько пояснений. Первой строчкой мы формируем дату — например, для 20.12.2003 получим 20031220000000, т.е. будем рассматривать только посещения после 12 ночи 20.12.2003. Далее формируем SQL-запрос. Уточню для тех, кто не очень знаком с SQL: с помощью запроса select мы делаем выборку из базы. Синтаксис его следующий: выбрать (имена полей через запятую) откуда (имя таблицы) где (условие). Мы подсчитываем количество (count) уникальных IP (distinct) и всех IP за сегодняшний день. Далее идет выполнение сформированного запроса, причем соединение с базой данных у нас уже должно быть установлено, то есть имеется указатель на соединение $cid. В четвертой строке с помощью функции mysql_fetch_array() получаем результат в массив $row, после чего выводим элементы массива функцией echo.
   
   Теперь получим популярные страницы за вчера:
   
   $cur_date=date("Ymd").'000000';
   $yes_date=date("Ymd", mktime (0,0,0,date("m"),date("d")-1,date("Y"))).'000000';
   $sql=”select distinct (self),count(self) as c from stat where dat>=”.$yes_date.” and dateis<”.$cur_date.” group by self order by c desc’”;
   $res=mysql_query($sql,$cid);
   echo “<ol>”;
   while($row=mysql_fetch_array($res))
    echo ”<li>”.$row[0].”: “.$row[1];
   echo “</ol>”;
   
   Чтобы получить вчерашнюю дату в функцию date, в качестве второго параметра подставляем метку времени UNIX, сформированную функцией mktime(). Хотя наш запрос похож на предыдущий, в нем появились некоторые новые элементы. Мы выбираем все уникальные страницы, а также подсчитываем количество просмотров каждой из них. Для связки страницы с количеством просмотров используется инструкция group, идущая в конце запроса. Также мы даем alias (короткое имя) общему количеству страниц count(self) as c, чтобы потом использовать его для сортировки страниц — order by c desc; desc указывает на то, что страницы будут идти в убывающем порядке, то есть первой будет самая популярная страница. Далее выполняем запрос и строим нумерованный список из того, что получили.
   
   Теперь давайте построим список всех серверов, с которых приходили посетители, за последние 30 дней:
   
   $month_date=date("Ymd", mktime (0,0,0,date("m")-1,date("d"),date("Y"))).'000000';
   $sql="select distinct substring_index(referer,'/',3),count(referer) as c from stat where referer<>'' and dat>=”.$month_dat.” group by substring_index(referer,'/',3) order by c desc ”
   
   Мы выбираем записи с непустыми referer’ами (referer<>'') и ограничиваем по времени последним месяцем. С помощью substring_index отсекаем в параметре referer все, что находится после 3-го слеша, т.е. оставляем только домен сайта (например, из http://meta-ukraine.com/search.asp?q= делаем http://meta-ukraine.com). С помощью distinct выбираем все уникальные домены, подсчитываем их count’ом, группируем по домену и сортируем по количеству в убывающем порядке. Выполнение запроса и построение списка аналогично предыдущему примеру.
   
   Еще один пример — посмотрим, сколько страниц обошел поисковик за сегодня:
   
   $cur_date=date("Ymd").'000000'
   $robot=”Yandex”;
   $sql=”select count(page) from stat where agent like '%".$robot."%' and dat>=”.$cur_date;
   
   В переменную $robot можете подставлять имя агента нужного поисковика. Например, зная, что агент Яндекса имеет такой вид: Yandex/1.01.001 (compatible; Win16; I), мы укажем лишь имя поисковика, которое должно встретиться в названии. Поэтому мы используем не «равно», а like ‘%Yandex%’ (% значит «любое количество любых символов»).
   
   Кстати, о поисковиках. Первые три запроса будут не совсем точными, так как мы будем засчитывать заходы поисковиков как визиты посетителей, что несколько исказит наши данные, поэтому необходимо отделить посетителей от роботов. Это можно сделать как по имени агента, которое мы уже записали в таблицу, так и по IP. Для определения необходимо иметь таблицу с IP или агентами существующих поисковиков. Вот шаблон такой таблицы (заполнить ее вам нужно будет заполнить самостоятельно):
   
   CREATE TABLE `robots` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `agent` char(50) default NULL,
    PRIMARY KEY (`id`),
    KEY `id` (`id`)
   ) TYPE=MyISAM;
   
   Выберем все имена из этой таблицы и сформируем строку, которая должна быть вставлена во все запросы в конструкцию where.
   
   $sql=”select agent from robots”;
   $res=mysql_query($sql,$cid);
   $norobots=” agent not in (”;
   $flag=0;
   while($row=mysql_fetch_array($res))
    if ($flag==0) { $norobots.=” ’ ”.$row[0].” ‘ ”;
    $flag=1;
    }
    else $norobots.=”, ’ ”.$row[0].” ‘ ”;
   $norobots.=”) ”;
   
   Вставив строку $norobots, например, в первый запрос —
   
   $sql=”select count(distinct(uip)),count(uip) from stat where dat>=”.$cur_date.” and “.$norobots;
   
   получим
   
   select count(distinct(uip)),count(uip) from stat where dat>=20031220000000 and agent not in (‘Rambler’,’Google’,’Yandex’,’Bigmir’,’Aport’)
   
   not in означает, что рассматриваемое поле не должно входить в множество значений, указанных в скобках через запятую. Теперь мы не будем учитывать при подсчете хостов и хитов перечисленные поисковики.
   
   На примере рассмотренных запросов вы сможете сформировать оставшиеся отчеты и представить их в удобной форме. В какой — зависит от ваших желаний, фантазии и навыков. Это могут быть просто списки (как было показано в статье), таблицы, графики. Перед вами стоит задача не столько сложная, сколько достаточно объемная, поэтому желаю вам не останавливаться на полпути. Если возникнут затруднения, все вопросы можно отправлять на мой email.
   
   
   
   


<<НАЗАД      ОЦЕНИТЬ СТАТЬЮ    ВЕРСИЯ ДЛЯ ПЕЧАТИ>>
Статья прочитана :  раз.




пейкюлю



 
 
 
 
 
pauk ©® 2000-2015. All rights reserved.
При перепечатке ссылка на сайт и указание обязательны.
Мнение администрации сайта не всегда совпадает с мнением автора.
Орфография и пунктуация - авторские.
Администрация не несет никакой ответственности за использование материалов.
.
Protected by Copyscape DMCA Takedown Notice Infringement Search Tool