Online-Counter
CK1
- cgi
0 Wolfgang Wiese0 CK1
Hi,
da ich heute im Chat das dritte mal nach einer Online-Counter-Loesung
gefragt wurde, hab ich mir gedacht, ich stelle einfach mal eine
Loesung vor ,)
Also, man erstellt einen Frame und/oder ein extra Fenster, in dem
man ein Perl-Script (was denn sonst? *g*) laedt.
Das Perl-Script liest in einem regelmaessigen Abstand eine Datei aus
und schreibt das ganze dann in das Fenster.
In der Haupt-Datei wird ueber SSI ein weiteres Script gestartet, dass
die Zahl in der Datei um eines erhoeht und die Datei dann neu erstellt
und dort hinein schreibt.
In der HTML-Datei muss ausserdem ein Script sein, dass ein neues Fenster
oeffnet mit der URL eines Perl-Scripts, dass die Zahl in der Datei
einliest, dekrementiert und dann wieder in die Datei schreibt.
Um das ganze zu verdeutlichen, poste ich den Quelltext einfach mal
mit:
[count1.pl]
#!/usr/bin/perl
open(DAT,"<count.dat");
$uo = <DAT>;
close(DAT);
print <<EOT;
Content-type: text/html
<html>
<head>
<meta http-equiv="refresh" content="10; URL=/cgi-bin/counter/count1.pl">
</head>
<body>
users online: $uo
</body>
</html>
EOT
[count2.pl]
#!/usr/bin/perl
$Daten = $ENV{"QUERY_STRING"};
print "Content-type: text/html\n\n";
if ($Daten eq "ein")
{
$uo = &lesen;
$uo++;
&eintragen($uo);
} else {
$uo = &lesen;
$uo--;
&eintragen($uo);
}
sub lesen
{
my $uo = 0;
open(DAT,"<count.dat");
$uo = <DAT>;
close(DAT);
return $uo;
}
sub eintragen
{
my $uo = shift @_;
open(DAT,">count.dat");
print DAT "$uo";
close(DAT);
}
[count.shtml]
<!-- Diese Datei fuehrt das Script zum inkrementieren per SSI aus
und dekrementiert beim Verlassen des Dokuments die Zahl wieder -->
<html>
<head>
<title>blabla</title>
<script language="JavaScript">
<!--
function austragen()
{
window.open('/cgi-bin/counter/count2.pl?aus');
}
// -->
</script>
</head>
<body onunload="austragen();">
</body>
</html>
[index.htm]
<!-- diese Datei erstellt einfach nur das Frame-Set ,) -->
<html>
<head>
<title>blabla</title>
</head>
<frameset rows="50%,*">
<frame src="count.shtml?1">
<frame src="/cgi-bin/counter/count1.pl">
</frameset>
</html>
Bevor jetzt wieder Beschwerden oder so etwas kommen: ich weiss, das
Script ist bei weitem nicht perfekt... wenn z. B. jemand reloaded,
dann wird die Zahl nocheinmal inkrementiert, aber das soll auch
nur eine Anregung sein ,) Ihr koennt mir GERNE (ist sogar erwuenscht
*g*) Antworten posten, in dem solche Bugs umgangen werden ,)
Mein Ansatz waere, dass man eine zweite Datei anlegt, in der die IPs
der User mitgeschrieben werden, die auf der Seite sind... dann kann
man per if nur dann inkrementieren lassen, wenn die IP noch nicht
in der Datei steht. Sie muesste dann wieder entfernt werden, wenn das
Dokument verlassen wird.
Wie gesagt, die Skripte oben sind nur LoesungsANsaetze ,)
mfg
CK1
Hi,
[count1.pl]
#!/usr/bin/perl
Diese Datei liest die Zahl ein und gibt sie mit einer netten
Meldung aus ,)
open(DAT,"<count.dat");
$uo = <DAT>;
close(DAT);
Kein Filelocking?!??!?!?!
Ich bin Enttaeuscht von dir!
»» open(DAT,">count.dat");
»» print DAT "$uo";
»» close(DAT);
»» }
dito.
Ciao,
Wolfgang
Hi,
Kein Filelocking?!??!?!?!
Ich bin Enttaeuscht von dir!
*g* sorry, aber ich hab das "mal schnell" in einer ruhigen Stunde
zusammengeschrieben... solche Feinheiten wie "filelocking" usw.
kommen erst spaeter ,)
mfg
CK1