Forum Webscript.Ru
Программирование => Perl => Тема начата: IVM от 11 Июня 2002, 18:42:10
-
Подскажите, плз подробнее как сделать счётчик посещений (или готовый CGI скрипт), счётчик должен работать в локальной сети 192.168.*.* не имеющей выхода в инет.
Кроме того, увеличение значения должно блокироваться, если посещение страницы было выполнено повторно с одного IP в течение заданного времени.
-
#!/usr/bin/perl
use Time::Local;
$minLen=1; # minimum number of digits in bigmap
%adrr=(\'addr1\' => \'file1.dat\',
\'addr2\' => \'file2.dat\'
);
$client=$ENV{HTTP_REFERER};
$client=~s/\\/[^\\/]*$//;
$counterFile=$adrr{$client};
exit unless $counterFile;
@digits = ("3c 66 66 66 66 66 66 66 66 3c", # 0
"30 38 30 30 30 30 30 30 30 30", # 1
"3c 66 60 60 30 18 0c 06 06 7e", # 2
"3c 66 60 60 38 60 60 60 66 3c", # 3
"30 30 38 38 34 34 32 7e 30 78", # 4
"7e 06 06 06 3e 60 60 60 66 3c", # 5
"38 0c 06 06 3e 66 66 66 66 3c", # 6
"7e 66 60 60 30 30 18 18 0c 0c", # 7
"3c 66 66 66 3c 66 66 66 66 3c", # 8
"3c 66 66 66 66 7c 60 60 30 1c"); # 9
&incrementCount;
&generateBitmap;
&writeBitmap;
sub writeBitmap
{ print "Content-type: image/x-xbitmap\\n\\n";
printf ("#define count_width %d\\n#define count_height 10\\n", $len*8);
printf STDOUT "static char count_bits[] = {\\n";
for($i=0; $i<($#bytes+1); $i++)
{ print("0x$bytes[$i]");
if ($i != $#bytes)
{ print(",");
if (($i+1) % 7 == 0)
{ print("\\n");
}
}
}
print("};\\n");
}
sub generateBitmap
{ $count = $totalReads;
@bytes = ();
$len = length($count) > $minLen ? length($count) : $minLen;
$formattedCount = sprintf("%0${len}d",$count);
for ($y=0; $y < 10; $y++)
{ for ($x=0; $x<$len; $x++)
{ $digit=substr($formattedCount,$x,1);
$byte=substr(@digits[$digit],$y*3,2);
push(@bytes,$byte);
}
}
}
sub incrementCount
{ my (@a,$time,$remoteAdr,$limit);
$time=timelocal((localtime)[0..5]);
$remoteAdr=$ENV{REMOTE_ADDR};
$limit=300;
if (open(F,"<$counterFile"))
{ flock(F,1);
chomp ($totalReads=);
while ()
{ chomp;
@a=split(/;/,$_);
$lastClient{$a[0]}=$a[1];
}
close(F);
}
$totalReads++ if (!$lastClient{$remoteAdr} || $time-$lastClient{$remoteAdr}>$limit);
$lastClient{$remoteAdr}=$time;
if (open(F,">$counterFile"))
{ flock(F,2);
print F "$totalReads\\n";
foreach (keys %lastClient)
{ print F "$_;$lastClient{$_}\\n" if ($time-$lastClient{$_}<$limit);
}
close(F);
}
}
Скрипт можно использовать для нескольких адресов.
В хэше %adrr заносится \'адресс страницы\' на которой установлен счётчик и файл для этой страницы.
При первом использовании файлы должны существовать, права для них - 6Х6. Для скрипта - как обычно 7Х5.
-
Забыл сказать счётчик не увеличивается в течении 5 минут (переменная $limit=300 в ф-ции incrementCount) для данного айпи-адреса.
Удачи.
-
Сорри, но я в Perl ламер полный.
поставил я Perl5 под винды, как задать права?
и как создать файлы для первого испольования и в каком формате?
-
Файлы данных - просто пустые файлы создай, 0 байт длинной, никакой формат тебе не нужен.
В юниксе права задать - chmod.
chmod 606 file1.dat
Смысл в том, чтоб пользователям разрешить читать и писать в файл, а скрипт читать и выполнять. Для себя - какие хочешь, логично предположить, что для скрипта все - читать, писать и выполнять, а для файлов данных - читать и писать. Группе - не важно.
Забыл ещё сказать, что в html-коде страницы счётчик присоединяется так:
Страница посещена раз.
-
В Юниксе????.... дык я всё это под WinXP+Апач+Перл делать собрался.
Текст скрипта положить в файл *.pl?
Слышал както, что вроде возникают какието проблемы с окончанием строк (т.е. в Юниксе и Виндах они разные).
Т.е. можно выделить текст скрипта и через буфер поместить его как текст в файл "name_fale.pl", не внося никаких изменение в окончания строк, так?
-
В Юниксе????.... дык я всё это под WinXP+Апач+Перл делать собрался.
Текст скрипта положить в файл *.pl?
Слышал както, что вроде возникают какието проблемы с окончанием строк (т.е. в Юниксе и Виндах они разные).
Т.е. можно выделить текст скрипта и через буфер поместить его как текст в файл "name_fale.pl", не внося никаких изменение в окончания строк, так?
Всё правильно.
А если в виндах, то не знаю, web-серверу нужно указать те права, что я выше тебе написал.
-
Какие там проблемы концов строк????
Открывай блокнот, копируй туда буфер обмена, но даже если ты вдруг решишь набрать всё вручную (дабы не перегружать оперативку:-)))))))))))) то какие могут быть проблемы, тебе надо воспользоваться специальным навороченным редактором, который умеет кодировать в юникс-кодировку, тогда может проблему и получишь, но надо для этого постараться...
Теперь насчёт прав, забей на них, в виндах их нет, если ты правильно устанавливал веб-сервер, по инструкции:-) то там не должен быть обойдён момент указания папки для скриптов, туда этот скрипт и помести...
кстати убедись в том, что путь к Перл у тебя совпадает. Подробнее про апачи + Перл и др... читай доку: http://userguide.webservis.ru/homeserver-apache-forprint.shtml
Вот...
-
Установил Perl522 на C:/usr
создал файл st.pl, скопировал в него приведённый Evgeny код.
В коде вместо %adrr=(\'addr1\' вставил %adrr=(\'../main.html\' (в main.html вставил строку: )
...ничего не работает, размер файлов *.dat остаётся нулевым.
Счетчик отображается пустым квадратиком. :-(
Запускал: "Perl -c st.pl" - открывается и сразу гаснет окно DOS, сообщений об ошибках нет...
-
Так, а для того, чтобы скрипты заработали надо Апач обязательно установить и настроить, да?
А то я их запускал только при установленном Перле, без Апача... возможно из-за этого они и не работали.
Ну ламер я, ЛАААМЕР!!!!
-
Не правильно %adrr задал.
Если счётчик установтен на странице ../main.html, то нужно адрес так писать: http://tvoi_adress.ru/main.html
-
Или напиши сюда адрес страницы, на которой счётчик установить хочешь и имя dat-файла, который с ней связать нужно, я тебе напишу, как должен выглядеть хэш %addr.
-
Evgeny не подскажешь как мне быть?
Мне нужна служба счётчиков, которая регистрирует обращения по определённому id, а не по хосту, т.е. мне надо чтобы обращения с разных хостов (у меня так сайт расположен) регистрировались одним счётчиком...
-
Еще одна поднятая тема счетчиков - получиш бан.
По теме, или пишеш сам (будут вопросы - обращайся), не умееш - пишеш вот сюда http://forums.webscript.ru/forumdisplay.php?s=&forumid=22
Тема закрыта.