|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/400 19 Jan 2003 14:33:24 To : Alexander Ponomarenko Subject : Re: Counter -------------------------------------------------------------------------------- Здравствуй, Alexander Ponomarenko. AP> Hello everybody. AP> Вот дописал счетчик. Посмотрите и зацените плиз. Интересуют возможные AP> ошибки race condition очевиднейший. Когда ты пишешь данные в счетчики, там уже не те данные, которые оттуда читались, вообще говоря. Когда исправишь, логика может оказаться уже почетче, посмотрим, что еще неправильно. AP> и предложения по оптимизации: AP> === Cut === AP> #!/usr/bin/perl -w AP> use CGI qw(:standard); AP> use Fcntl qw(:flock); AP> use 5.004; AP> my $num=param("num"); AP> my $admin=param("admin"); AP> if(defined($admin)) { AP> print"Content-type: text/html\n\n"; AP> print"<html><body>Counter v1.0<br><table width=500><tr AP> bgcolor=lightblue><td>IP print"<html>Adress</td><td>Time (days AP> ago)</td><td>Time AP> (hours print"<html>ago)</td><td>Count</td></tr>"; open(IP,"cgifiles/count_ip AP> "); flock(IP,LOCK_SH); while(defined($rec=<IP>)) { AP> ($ip,$t,$col)=split(/:/,$rec); $t=(time()-$t); $day=$t/60/60/60; AP> $t=$t/60/60; AP> print"<tr bgcolor=lightgrey><td>$ip</td><td>$day</td><td>$t</td><td>$col</td AP> ></tr>"; } close(IP); print"</table></body></html>"; } AP> if(defined($num)) { AP> open(COUNT,"cgifiles/count"); AP> flock(COUNT,LOCK_SH); AP> $nomer=<COUNT>; AP> close(COUNT); AP> chomp($nomer); AP> if($num eq "1") { AP> $user_ip=$ENV{REMOTE_ADDR}; AP> open(IP,"cgifiles/count_ip"); AP> flock(IP,LOCK_SH); AP> while(defined($rec=<IP>)) { AP> chomp($rec); AP> ($ip,$t,$col)=split(/:/,$rec); AP> $hash{$ip}=$t; AP> $colvo{$ip}=$col; AP> } AP> close IP; AP> $hash{$user_ip}=$hash{$user_ip}+10*60; AP> $colvo{$user_ip}++; AP> if($hash{$user_ip}>time()) {$sec="1"} AP> $hash{$user_ip}=time(); AP> open(IP,">cgifiles/count_ip"); AP> flock(IP,LOCK_EX); AP> foreach $key (sort keys %hash) { AP> print IP "$key:$hash{$key}:$colvo{$key}\n"; AP> } AP> close IP; AP> } AP> if(($num eq "1") and (!defined($sec))) { AP> $nomer++; AP> open(COUNT,">cgifiles/count"); AP> flock(COUNT,LOCK_EX); AP> print COUNT "$nomer\n"; AP> close(COUNT); AP> } AP> @nomber=split("",$nomer); AP> $fil="../html/pics/$nomber[$num-1].gif"; AP> print"Content-type: image/gif\n\n"; AP> open(PIC,$fil); AP> flock(PIC,LOCK_SH); AP> while(defined($rec=<PIC>)) { AP> print $rec; AP> } AP> close(PIC); AP> } AP> === Cut === AP> Вызывается отдельно для каждой из 4х цифр (параметр "num"). Hе позволяет AP> одному IP-адресу обновлять счетчик в течении 10 минут. Можно смотреть AP> статистику, если задать параметр "admin". AP> P.S.: Image Magick не предлагать. Важно возвращать по одной цифре. AP> Alexander -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/14454448423a8.html, оценка из 5, голосов 10
|