В этой статье рассказывается о том, как с помощью перла и библотеки GD написать счетчик типа SpyLog / HotLog.
Чем собственный счетчик лучше? Существуют различные сервисы счетчиков, но всвязи с огромным количеством сайтов, на которых эти счетчики установлены, эти системы жудко тормозят. К примеру, HotLog падает как минимум раз в неделю, следовательно, посетители не учитываются. За эффективность так же берет деньги SpyLog. Зачем платить деньги, если можно написать собственный счетчик с собственной статистикой?
Этап 1. Создание таблиц в MySQL.
Задумаемся, какую информацию о посетителе нам нужно знать. По моим соображениям это должны быть: 1) время визита 2) IP посетителя 3) станица, с которой пришел посетитель 4) количество просмотренных страниц 5) страницы, которые посмотрел посетитель. Для экономии места лучше всего вносить первый и последний URL, который просмотрел посетитель.
Соответственно создаем таблицу с вышеописанными столбцами:
CREATE TABLE visitors ( vtime datetime not null, ip text not null, referer text not null, hits int not null, firsturl text not null, lasturl text not null);
Если задача счетчика - подсчиывать посетителей одного сайта, то можно ограничиться этой таблицей, если же нужно подсчитывать больше одного сайта, стоит завести еще одну таблицу со столбцами: 1) id сайта 2) посетителей всего было на сайте 3) посетители за сегодня 4) хиты за сегодня
Этап 2. Создание скрипта
Создадим файлик, обзовем его counter.pl :
#/usr/bin/perl -w use DBI; # Загружаем модуль для работы с MySQL use GD; # Загружаем модуль для работы с графикой
$w_database=counter; # имя MySQL базы $w_host=localhost; # Адерс MySQL сервера. Обычно MySQL сервер установлен вместе с web-serverом, поэтому пишем localhost. $w_user=; # Логин для входа в MySQL $w_password=; # Пароль для входа в MySQL
# Соединяемся с MySQL по заранее созданым: базе, пользователю, паролю $dbh = DBI->connect(DBI:mysql:$w_database:$w_host,$w_user,$w_password) die $DBI::errstr;
Этап 3. занесение информации о посетителе в таблицу.
Посетитель заходит на сайт, смотрим, первый ли раз он зашел на сайт за сегодня, одновременно проверяем количество хитов:
$check= $dbh->prepare(SELECT hits FROM counter WHERE ip=$ENV{REMOTE_ADDR} AND vtime=$today) die $DBI::errstr; # Берем количество хитов, если запись существует. $check->execute() or die $check->errstr; $ipcheck = $check->fetchrow; # Назначаем количество хитов указанной переменной.
Теперь, если значение $ipcheck пустое, то посетитель зашел первый раз а этот день и его нужно добавить в таблицу. Если посетитель зашел не в первый раз, то значение $ipcheck содержит количество просмотренных страниц.
# ! сюда вставить проверку $wherefrom на лишние символы !
if (!$ipcheck) { # старый посетитель $dbh->do(update counter set vtime=$today, hits=$hits, lasturl=$refererl) or die $DBI::errstr or die $DBI::errstr; } else { # новый посетитель $dbh->do(insert into counter (vtime,ip,referer,hits,firsturl,lasturl) values ($today,$ENV{REMOTE_ADDR},$wherefrom,$hits,$refererl,$refererl)) or die $DBI::errstr or die $DBI::errstr; }
Далее выводим общее количество посетителей и посетителей за сегодня.
$check1= $dbh->prepare(SELECT hits FROM counter WHERE vtime=$today) die $DBI::errstr; $check1->execute() or die $check->errstr; $nn=0; while ($ipcheck1=$check1->fetchrow_hashref()) { $vhits=$vhits+$ipcheck1->{hits}; $nn++; }
$check2= $dbh->prepare(SELECT count(*) FROM counter) die $DBI::errstr; $check2->execute() or die $check->errstr; $vall = $check2->fetchrow;
Этап 4. Отображение счетчика.
Счетчик можно взять как из картинки, так и нарисовать с нуля. Ниже приведен пример прорисовки счетчика по линиям.
print Content-type: image/png
; # Формат документа - картинка
$im = new GD::Image(88,31); # Создаем изображение размером 88x31 пикселей
$im->rectangle(0,0,87,30,$red); # Рисуем рамку $im->fill(86,29,$blue); # Заливаем все синим $im->line(1,16,86,16,gbBrushed); Рисуем линии $im->line(67,16,60,29,gbBrushed); $im->line(37,1,31,16,gbBrushed); $im->fill(85,28,$white); # Два поля, отделенные линиями, заливаем белым $im->fill(1,1,$white); $im->rectangle(1,1,86,29,$white); # Белая рамка $im->rectangle(0,0,87,30,$blue); # Синяя рамка $im->string(gdSmallFont,3,2,$vhits,$blue); # Выводим количество сегодняшних хитов $im->string(gdSmallFont,3,16,$vall,$white); # Выводим количество всех посетителей $im->string(gdSmallFont,41,2,WebZ.Ru,$white); $im->string(gdSmallFont,68,17,$vtoday,$blue);# Выводим количество сегодняшних посетителей binmode STDOUT; print $im->png; # Вывод на экран
Этап 5. Код счетчика.
Код счетчика стостоит не только из картинки, но и из ява-скрипта, который должен передать страницу, с которой пришел новый посетитель. Чтобы счетчик не кэшировался, стоит в его код встроить случайное значение. Пример:
В результате, при помещении вышеуказанного кода на страницу, выводится картинка с: общим числом посетителей, числом посетителей за сегодня и сегодняшними хитами. Пример такого счетчика можно увидеть здесь: http://cc.webz.ru