Christian Bliß: Counter mit Macken

Beitrag lesen

Hallo,

ich habe folgendes Counter-Script in Perl geschrieben. Jedoch passiert es manchmal, dass sich der Counter "zurücksetzt" und von Null beginnt zu zählen. Das muss wohl irgendwie mit dem FLOCK zusammenhängen, denk ich mal. Aber wo ist der Fehler?

#!/usr/bin/perl -w
use CGI::Carp qw(fatalsToBrowser);

Standardvariablen

$root = -- zensiert für self-html-forum --
$ip = $ENV{'REMOTE_ADDR'};
$zeit = time;

andere Variablen

$reload = 3600; # entspricht 1 Stunde Reloadsperre

open(BNCHR, "<$root/cgi-bin/counter/benachrichtigung.txt");
flock BNCHR, 2;
$zaehlerstand_benachrichtigung = <BNCHR>;
close(BNCHR);

HTML als Ausgabetyp festlegen

print "Content-type: text/html\n\n";

Alte IP-Adressen in ip.txt löschen START

open(IP, "<$root/cgi-bin/counter/ip.txt");
flock IP, 2;
open(IPTMP, ">$root/cgi-bin/counter/ip.txt.tmp");
flock IPTMP, 2;
while (<IP>) {
  my ($l_ip, $l_zeit) = split(/##/, $_);
  chop($l_zeit);
  $alter = $zeit - $l_zeit;
  next if ($alter > $reload);
  print IPTMP "$l_ip##$l_zeit\n";
}
close(IPTMP);
close(IP);

unlink ("$root/cgi-bin/counter/ip.txt");
rename ("$root/cgi-bin/counter/ip.txt.tmp", "$root/cgi-bin/counter/ip.txt");

Alte IP-Adressen in ip.txt löschen ENDE

Zählerstand auslesen

open(COUNT, "<$root/cgi-bin/counter/count.txt");
flock COUNT, 2;
$zaehlerstand = <COUNT>;
close(COUNT);

open(IP, "<$root/cgi-bin/counter/ip.txt");
flock IP, 2;
while (<IP>) {
  my ($l_ip, $l_zeit) = split(/##/, $_);
  chop $l_zeit;
  if ($ip eq $l_ip) {
    print "Besucher: <B>$zaehlerstand</B>";
    exit;
  }
}
close(IP);

$zaehlerstand++;

open(COUNT, ">$root/cgi-bin/counter/count.txt");
flock COUNT, 2;
print COUNT "$zaehlerstand";
close(COUNT);

open(IP, ">>$root/cgi-bin/counter/ip.txt");
flock IP, 2;
print IP "$ip##$zeit\n";
close(IP);

print "Besucher: <B>$zaehlerstand</B>";

if ($zaehlerstand eq $zaehlerstand_benachrichtigung) {
  open (MAIL, "|/usr/sbin/sendmail -t");
  print MAIL "To: -- zensiert für self-html-forum --\n";
  print MAIL "From: -- zensiert für self-html-forum --\n";
  print MAIL "Subject: Zählerstand bei $zaehlerstand\n\n";
  print MAIL "Hallo Chef,\n\n";
  print MAIL "der Zählerstand $zaehlerstand wurde soeben erreicht!\n\n";
  print MAIL "Mit freundlichen Grüßen\n";
  print MAIL "dein Projekt\n";
  close(MAIL);

$zaehlerstand_benachrichtigung_neu = $zaehlerstand_benachrichtigung+10000;

open(BNCHR, ">$root/cgi-bin/counter/benachrichtigung.txt");
  flock BNCHR, 2;
  print BNCHR "$zaehlerstand_benachrichtigung_neu";
  close(BNCHR);
}