Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Counter   Alexander Ponomarenko   18 Jan 2003 18:47:33 
 Re: Counter   Artem Chuprina   19 Jan 2003 14:33:24 
 Counter   Alexander Ponomarenko   21 Jan 2003 13:36:59 
 Re: Counter   Konstantin Tokar   24 Jan 2003 12:46:44 
 Counter   Alexander Ponomarenko   29 Jan 2003 14:25:08 
 Re: Counter   Konstantin Tokar   30 Jan 2003 13:00:58 
Архивное /ru.cgi.perl/14454448423a8.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional