CK1: Online-Counter

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

Diese Datei liest die Zahl ein und gibt sie mit einer netten

Meldung aus ,)

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

Dieses Script inkrementiert die Zahl, wenn "ein" als Parameter

uebergeben wird und dekrementiert sie, wenn "aus" als Parameter

uebergeben wird.

$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

  1. 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

    1. 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