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);
}