| E-Mail: | |
|---|---|
| Homepage-URL: |
Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!
Auf vielen Seiten sieht man heutzutage folgenden Text:
Es sind derzeit 42 Besucher online.
Dieser Text zeigt an, wie viele Besucher sich gerade auf der Webseite bewegen. Dieser Artikel soll zeigen, wie so eine Anzeige realisiert werden kann und welche Probleme dabei auftreten.
Selbstverständlich muss für eine derartige Anzeige eine serverseitige Technik bereitstehen. In diesem Artikel wird Beispielcode in Perl und PHP angegeben. Natürlich lässt sich dieser Code genauso auf andere serverseitige Techniken übertragen, wie zum Beispiel andere Programmiersprachen wie Python oder Ruby oder auch Umgebungen wie Microsofts Active Server Pages.
Falls Sie sich für die Thematik nur oberflächlich interessieren, die Probleme ignorieren wollen und nur eine solche Anzeige realisieren wollen, dann reicht es aus, wenn Sie nur den
ersten Lösungsvorschlag lesen sowie sich den
Download holen.
Die Realisierung einer Anzeige, wie viele Benutzer sich im Moment auf der Seite befinden, ist weniger trivial als es zuerst erscheint. Webseiten werden über das Protokoll HTTP übertragen. Die Übertragung über HTTP erfolgt auf folgende Weise: Als erstes öffnet der Browser die Verbindung zum fremden Server. Dann übermittelt der Browser dem Server den Namen der Ressource, die er erfahren will. Der Server liefert ihm daraufhin die Ressource (oder eine Fehlermeldung) aus. Daraufhin wird die Verbindung zum Server wieder abgebaut. Dieser Ablauf lässt sich durch folgendes Diagramm visualisieren:

Da die Verbindung abgebaut wird, kann der Webserver nicht erfahren, ob der Benutzer sich noch auf der Seite befindet oder nicht. Wenn der Benutzer sein Browserfenster schließt, in seine Adresszeile etwas eingibt oder einfach über einen Link die Seite verlässt, dann besteht keine Möglichkeit für den Server, von dem die Seite kam, dieses Ereignis mitzubekommen.
Es gibt in HTTP die Möglichkeit, dass die Verbindung zum Server aufrecht erhalten bleibt. Damit muss der zeitintensive Verbindungsaufbau nicht mehrmals durchgeführt werden, wenn zum Beispiel Bilder der Webseite nachgeladen werden müssen. Dieses Feature nennt sich Connection: keep-alive. Allerdings wird diese Verbindung im Normalfall sofort wieder geschlossen, sobald alle Elemente einer Webseite geladen sind. Desweiteren sind alle Anfragen, die über diese Verbindung an den Server gesendet werden, unabhängig voneinander. HTTP bietet keine Möglichkeit, diese Anfragen einem Benutzer zuzuordnen. Connection: keep-alive ist also keine Lösung für das Problem.
Eine Möglichkeit, dieses Problem zu umgehen, wäre ein Zeitlimit. Jedem Rechner, mit dem ein Besucher sich mit dem Internet verbindet, wird bei der Einwahl eine sogenannte IP-Adresse zugeordnet. Diese IP-Adresse ist dem Server auch bekannt. Wenn nun eine Anfrage von einer IP-Adresse kommt, dann wird diese IP-Adresse und das aktuelle Datum sowie die aktuelle Zeit in einer Liste gespeichert. Wenn die IP-Adresse bereits in der Liste existiert, wird der bestehende Eintrag überschrieben. Die IP-Adresse wird also als Identifikationskriterium für den Besucher verwendet.
Bevor Anfragen gekommen sind, ist die Liste leer. Sobald jedoch die erste Anfrage von einer IP-Adresse gekommen ist, sieht die Liste so aus:
| IP-Adresse | Zeitpunkt des letzten Zugriffs |
|---|---|
192.168.0.5 |
01.06.2003 14:24:36 |
Sobald nun eine weitere Anfrage von einer anderen IP-Adresse kommt, sieht die Liste so aus:
| IP-Adresse | Zeitpunkt des letzten Zugriffs |
|---|---|
192.168.0.5 |
01.06.2003 14:24:36 |
192.168.0.8 |
01.06.2003 14:27:09 |
Nun kommt noch eine Anfrage von der ersten IP-Adresse. Die Liste sieht nun so aus:
| IP-Adresse | Zeitpunkt des letzten Zugriffs |
|---|---|
192.168.0.5 |
01.06.2003 14:28:15 |
192.168.0.8 |
01.06.2003 14:27:09 |
Wenn die Anzahl der Besucher, die gerade online sind, angezeigt werden soll, dann werden aus der Liste alle Einträge gefiltert, die älter als eine bestimmte Zeit, zum Beispiel fünfzehn Minuten, sind. Die Anzahl der restlichen Einträge ergibt dann eine Annäherung an die Anzahl der Besucher, die gerade online sind.
Hier wird die Funktion in PHP angegeben, der Perl-Code ist aus dem zu diesem Artikel zugehörigen Download zu entnehmen. Als erstes wird eine Funktion benötigt, die den aktuellen Besucher zu der Liste hinzufügt:
zaehle_besucher:
// zählt den aktuellen Besucher
function zaehle_besucher ($ident) {
// hole die Liste
$liste = hole_besucher_liste ();
// füge das aktuelle Identifikationskriterium mit aktuellem Datum hinzu
$liste[$ident] = time ();
// schreibe die Liste
schreibe_besucher_liste ($liste);
}
Diese Funktion holt sich zuerst die komplette Liste aller Besucher. Dazu ruft sie die Funktion hole_besucher_liste auf. Diese Liste stellt ein assoziatives Array dar. Als Schlüssel wird das jeweilige Identifikationskriterium für den Benutzer verwendet, als Wert die Zeit des Zugriffs als UNIX-Zeitstempel. (Hier wird für das Identifikationskriterium die IP-Adresse verwendet) Diese Struktur ist besonders praktisch, da man sich nicht mehr darum kümmern muss, ob ein Eintrag bereits existiert oder nicht. Das aktuelle Identifikationskriterium, das über den Parameter ident übergeben wird, und der aktuelle Zeitstempel werden nun der Liste hinzugefügt. Als letztes wird die Liste mit der Funktion schreibe_besucher_liste zurückgeschrieben.
hole_besucher_liste:
// holt die Liste aus einer Datei
function hole_besucher_liste () {
// importiere die Konfiguration
global $besucher_online_konfiguration;
// lese datei
$zeilen = file ($besucher_online_konfiguration['datei']);
// fehler?
if (!is_array ($zeilen)) {
return array ();
}
$ergebnis = array ();
// gehe die Zeilen durch
foreach ($zeilen as $zeile) {
// trenne Identifikationskriterium von Zeitstempel
list ($ident, $stempel) = explode ('|', $zeile, 2);
// wenn Identifikationskriterium leer ist, dann übergehen
if (empty ($ident)) {
continue;
}
// wenn stempel zu alt ist
if ($stempel < time() - $besucher_online_konfiguration['zeitlimit']) {
// übergehen
continue;
}
// füge zum Ergebnis hinzu
$ergebnis[$ident] = (int)$stempel;
}
return $ergebnis;
}
Diese Funktion importiert sich als erstes die Konfiguration. Dort sind Dateiname und Zeitlimit angegeben. Näheres zu der Konfiguration weiter unten. Die Datei wird mit der file-Funktion eingelesen. Diese liefert alle Zeilen als ein Array zurück. Falls ein Fehler aufgetreten ist, also die Funktion kein Array zurückgibt, dann wird eine leere Liste zurückgegeben.
Nun wird die Ergebnisliste initialisiert. Daraufhin wird in einer foreach-Schleife jede Zeile abgearbeitet. Die Datei mit der Liste sieht typischerweise so aus:
127.0.0.1|1054378620 192.168.100.2|1054381432
In dieser Datei sind also IP-Adresse und Zeitstempel durch ein |-Zeichen getrennt. Nach diesem Zeichen wird auch mit dem explode-Aufruf in der Funktion hole_besucher_liste getrennt. Falls die IP-Adresse leer ist, also auch die Zeile leer war, wird der Eintrag einfach ignoriert. Falls der Zeitstempel zu alt ist, geschieht dies ebenso. Ansonsten wird der Variable $ergebnis die IP-Adresse und der Zeitstempel zugewiesen. Die explizite Umwandlung in eine Zahl ist notwendig, da die file-Funktion das Zeichen für die neue Zeile mitliest. Dies ist beim Zurückschreiben nicht schön, denn sonst entstehen viele Leerzeilen. Als letztes wird die Ergebnisliste zurückgegeben.
schreibe_besucher_liste:
// schreibe die Liste zurück
function schreibe_besucher_liste ($liste) {
// importiere die Konfiguration
global $besucher_online_konfiguration;
$ergebnis = '';
// gehe die Liste durch
foreach ($liste as $ident => $stempel) {
$ergebnis .= "$ident|$stempel\n";
}
// öffne datei
$datei = fopen ($besucher_online_konfiguration['datei'], 'w');
// Fehler?
if (!is_resource ($datei)) {
return false;
}
// schreibe das ergebnis
$cnt = fwrite ($datei, $ergebnis);
// fehler?
if ($cnt === false) {
fclose ($datei);
return false;
}
// schließe die Datei
fclose ($datei);
// wir sind fertig
return true;
}
Diese Funktion dagegen schreibt die Besucherliste wieder zurück. Zuerst wird wieder die Konfiguration importiert. Dann wird die Liste durchgegangen und jeder Eintrag einer Zeichenkette $ergebnis hinzugefügt. Der Inhalt der Zeichenkette sieht am Ende so aus, dass ihn die Funktion hole_besucher_liste wieder auslesen kann. Die Datei wird nun mit fopen zum Schreiben geöffnet. Falls dies fehlschlägt, bricht die Funktion ab. Nun wird mit fwrite die Ergebniszeichenkette in die Datei zurückgeschrieben. Die Datei wird nun geschlossen und die Funktion meldet, ob sie erfolgreich war.
anzahl_besucher:
// gibt die Anzahl der Besucher zurück
function anzahl_besucher () {
return count (hole_besucher_liste ());
}
Diese Funktion gibt die Anzahl der Besucher, die im Moment auf der Seite sind, zurück. Sie holt sich einfach die Besucherliste und zählt die Anzahl der Einträge.
// Konfiguration $besucher_online_konfiguration = array ( // in welcher Datei soll es gespeichert werden 'datei' => 'besucher_online.txt', // wie lange soll es dauern, bis ein Eintrag verfällt 'zeitlimit' => 300 // 5 Minuten );
Hiermit werden die Funktionen konfiguriert. Diese globale Variable wird von den Funktionen importiert und gibt Ihnen an, wie sie sich verhalten sollen. Der Eintrag datei gibt an, wie die Datei heißen soll, in der die Liste gespeichert wird. Relative und absolute Pfade sind möglich. Der Eintrag zeitlimit gibt an, wie lange eine IP-Adresse gespeichert werden soll. Diese Angabe ist in Sekunden.
<?php
// einbinden der Datei zum Zählen der Besucher, die Online sind
require 'user_online.php';
// diesen Besucher zählen
zaehle_besucher ($_SERVER['REMOTE_ADDR']);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Titel der Seite</title>
</head>
<body>
<?php $anz_besucher = anzahl_besucher(); ?>
<p>Es
<?php if ($anz_besucher == 1) { ?>
ist
<?php } else { ?>
sind
<?php } ?>
im Moment <?php echo $anz_besucher ?> Besucher online.</p>
</body>
</html>
Vor jeglicher Ausgabe des Scriptes muss der Besucher gezählt werden. Dies wird getan, indem die Funktion zaehle_besucher mit der aktuellen IP-Adresse aufgerufen wird. Die IP-Adresse des Clients steht in $_SERVER['REMOTE_ADDR']. Dies muss bei jedem HTML-Dokument der Webseite geschehen, auch wenn auf der Seite selbst keine Anzeige ist. Auf jeder Seite mit einer Anzeige muss zusätzlich die Anzahl der Besucher mit anzahl_besucher geholt und dann ausgegeben werden. Die Konstruktion mit if ist hier im Beispiel nur gemacht worden, damit die deutsche Grammatik stimmt, wichtig sind die hervorgehobenen Teile.
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use UserOnline;
BesucherOnline::zaehle_besucher ($ENV{'REMOTE_ADDR'});
print "Content-Type: text/html\n\n";
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); use UserOnline; my $anzahl = BesucherOnline::anzahl_besucher (); print "Content-Type: text/html\n\n"; print $anzahl;
Im
Download befindet sich ein Perl-Modul UserOnline.pm. Dieses Perl-Modul stellt die gleichen Funktionen bereit, die auch oben in PHP angegeben sind. Das Perl-Modul kapselt diese Funktionen zusätzlich in einem Paket. Das erste Script zählt nur den Besucher, das zweite Script gibt die Anzahl der Besucher aus. Die Konfiguration des Perl-Moduls erfolgt in der Moduldatei selbst, genauso wie die Konfiguration der PHP-Funktionen.
<!--#include virtual="/cgi-bin/countuser.pl"--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Titel der Seite</title> </head> <body> <p>Es sind im Moment <!--#include virtual="/cgi-bin/useronline.pl"--> Besucher online.</p> </body> </html>
Die beiden oberen Perl-Scripte werden nun per SSI eingebunden. Die Datei countuser.pl muss auf jeder Seite eingebunden werden, die Datei useronline.pl nur auf den Seiten, auf denen eine Anzeige notwendig ist. Weitere Hinweise zu SSI stehen in SELFHTML unter
Server Side Includes in HTML.
Falls die Seite teilweise oder komplett aus Perl-Scripten besteht, kann man anstelle von SSI das Perl-Modul direkt einbinden und die Funktionen direkt verwenden.
Um den Rahmen des Artikels nicht zu sprengen, wurden hier Dateisperrungsmechanismen nicht mit eingebunden. Im Download sind diese aber sehr wohl vorhanden. Es empfielt sich, die Dateien im Download zu verwenden anstelle der Funktionen, die hier abgedruckt sind.
Für Seiten mit sehr hohem Besucheraufkommen ist die Methode, die Informationen in Dateien zu speichern, ungeeignet. Es schluckt pro Aufruf einfach viel zu viel Rechenzeit, die komplette Datei einzulesen, die Daten zu verarbeiten und die Datei wieder abzuspeichern. Für Seiten mit hohem Besucheraufkommen ist es deshalb Ratsam, eine Datenbankgestützte Lösung zu verwenden. So etwas würde jedoch den Rahmen dieses Artikels bei weitem sprengen, so dass aus diesem Grund keine derartige Lösung hier angeboten wird.
Der erste Lösungsvorschlag besitzt jedoch verschiedene, schwerwiegende Nachteile:
Um diese Nachteile zu umgehen, werden in diesem Artikel zwei weiteren Lösungsvorschläge angeboten. Diese beiden weiteren Lösungsvorschläge bauen auf dem ersten Lösungsvorschlag auf und lassen sich beide Kombinieren. Jeder der beiden Lösungsvorschläge zielt nämlich auf einen bestimmten Nachteil ab.
Dieser Lösungsvorschlag soll den Nachteil der Identifikation des Benutzers eliminieren. Wie bereits erwähnt, ist die IP-Adresse ein denkbar schlechtes Identifikationskriterium. Nachdem das Problem, den Benutzer in Webanwendungen eindeutig über mehrere Anfragen hinweg zu identifizieren, nicht alleine auf solche Anzeigen beschränkt ist, gibt es bereits eine Lösung für dieses Problem: Sessions.
Beim ersten Aufruf einer Seite durch einen Browser wird eine eindeutige Nummer erzeugt. Diese eindeutige Nummer ist eine Zufallszahl, damit man die Sessionnummern anderer Benutzer nicht erraten kann. Meist wird diese Nummer an den Browser als Cookie gesandt. Dies hat zur Folge, dass der Browser diese Nummer bei jeder weiteren Anfrage wieder als Cookie an den Server schickt. Der Server kann den Benutzer anhand dieser Nummer eindeutig identifizieren. Es ist auch möglich, dass diese Nummer über URL-Parameter übertragen wird. Dies ist dann notwendig, wenn der Besucher Cookies deaktiviert hat. Jeder Link innerhalb der Seite muss dann zusätzlich mit dieser Nummer ausgestattet werden.
Session-Nummern werden auf dem Server meist Informationen zugeordnet. Dies ist vor allem für Logins praktisch - jemand braucht sich nur einmal einzuloggen und der Benutzername wird zu dieser Session-Nummer gespeichert. Sessions verfallen automatisch nach einer gewissen Zeit. Sonst könnte jemand durch ausprobieren die Session-Nummer eines angemeldeten Benutzers herausfinden. Außerdem wird somit Speicherplatz auf dem Server gespart - es gibt nämlich 2 hoch 128 verschiedene Möglichkeiten für eine typische Session-Nummer. Wenn für jede je existente Session-Nummer die Daten beibehalten würden, wäre der Serverspeicherplatz nach einiger Zeit aufgebraucht.
Das Problem bei Sessions: Sobald ein Browser den Server kontaktiert, ohne dass er eine Nummer besitzt, wird eine neue Session erzeugt. Somit kann ein einzelner Besucher aus versehen sehr viele Sessions erzeugen. Sessions können somit ein noch schlechteres Kriterium für die Identifikation der Anzahl der Besucher sein, als IP-Adressen.
Wenn die Seite jedoch einen Login anbietet, dann kann man jedoch eine Anzeige der registrierten Benutzer, die gerade online sind, erstellen. Man verwendet als eindeutiges Kriterium nicht mehr die IP-Adresse, sondern den Benutzernamen. Sonst verfährt man genauso wie im ersten Lösungsvorschlag. Natürlich kann man so lediglich die registrierten Benutzer zählen. Allerdings kann man die einzelnen Benutzer so genau identifizieren und der erste Nachteil des ersten Lösungsvorschlags ist wieder wettgemacht.
Die Funktion im ersten Beispiel ist sehr generisch gehalten. Daher kann sie einfach mit einem anderen Identifikationskriterium verwendet werden. Typischerweise werden Webanwendungen mit Sessions so programmiert, dass in einer zentralen Datei der Code zum initialisieren der Session und einiger anderer Dinge steht. Wenn diese Datei header.inc.php heißt und der Benutzername in $_SESSION['username'] steht, dann könnte die neue header.inc.php so aussehen:
<?php
// hier werden bestimmte Dinge initialisiert
// wie zum Beispiel die Session:
session_start ();
// hier werden weitere Dinge getan...
// einbinden der Datei zum Zählen der Besucher, die Online sind
require 'user_online.php';
// diesen Besucher zählen, falls er eingeloggt ist
if (!empty ($_SESSION['username'])) {
zaehle_besucher ($_SESSION['username']);
}
?>
Der Anfang der Datei bleibt weiterhin gleich. Die Anzeige wird genauso wie im ersten Beispiel eingebunden. Es wird einfach die Datei user_online.php eingebunden, die die Funktionen bereitstellt und dann - falls der Benutzer eingeloggt ist - der Benutzer gezählt. Die Bedingung, ob der Benutzer eingeloggt ist, heißt hier: Ist die Sessionvariable mit dem Benutzernamen leer oder nicht? Diese Bedingung kann natürlich - je nach Anwendung - auch anders lauten.
Man könnte sogar, dies geschieht in vielen Bulletin Boards, nicht nur die Anzahl der Benutzer, sondern auch die Namen der Benutzer, die im Moment angemeldet sind, anzeigen lassen. Dazu müßte der Anzeigecode so geändert werden:
<?php $besucher = hole_besucher_liste(); $anz_besucher = count ($besucher); ?>
<p>Es
<?php if ($anz_besucher == 1) { ?>
ist
<?php } else { ?>
sind
<?php } ?>
im Moment <?php echo $anz_besucher ?> Besucher online:
<?php echo implode (', ', array_keys ($besucher)); ?></p>
Hier wird zuerst die Besucherliste geholt. Daraufhin wird die Anzahl der Besucher ermittelt und diese Ausgegeben. Da die Benutzernamen als Schlüssel für den Array genommen werden, werden zuerst mit array_keys alle Schlüssel extrahiert. Diese Liste mit Schlüsseln (die ja eine Liste mit Benutzernamen darstellt) wird daraufhin mit implode in eine kommagetrennte Zeichenkette umgewandelt und dann ausgegeben.
Die Änderungen am bestehenden Perl-Code zum Zählen der einzelnen Besucher lassen sich analog zu den Änderungen im PHP-Code durchführen, es muss lediglich der Benutzername, der in den Scripten sowieso zur Verfügung steht, als Identifikationskriterium übergeben werden.
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use UserOnline;
my %liste = BesucherOnline::hole_besucher_liste ();
my @benutzer = keys %liste;
my $anzahl = @benutzer;
print "Content-Type: text/html\n\n";
print "Es sind im Moment $anzahl Besucher online: ";
print join (', ', @benutzer);
Dieser Perl-Code ist hier ebenso analog zum PHP-Code. Da sich Besucher über Sessions anmelden können, werden die Seiten vermutlich nicht über SSI erstellt. Daher sollte dieser Code nur als Vorlage für den Code dienen,der dann in bestehende Scripte eingebunden wird.
Der zweite Lösungsvorschlag besitzt auch einige gravierende Nachteile:
Dieser Lösungsvorschlag soll das Problem der Verweildauer auf einer Webseite eliminieren. Im Prinzip soll der Server in regelmäßigen Abständen noch einmal kontaktiert werden, damit er weiß, dass der Besucher noch online ist. Dieser Zeitabstand muss natürlich etwas kleiner als die Zeit sein, nach der ein Eintrag in der Liste verfällt.
Man könnte mit JavaScript bestimmte, nicht sichtbare, kleine Bilder in regelmäßigen Abständen neu laden lassen. Dies hätte zur Folge, dass der Server regelmäßig kontaktiert wird. Allerdings ist bei einigen Nutzern JavaScript deaktiviert und diese Methode somit unbrauchbar. Die Seite selbst neu zu laden fällt auch weg, da dies den Nutzer immens stören würde.
Als einzig brauchbare Lösung für das regelmäßige Kontaktieren erscheint dann nur noch ein Blindframe: Die eigentliche Seite wird in einen Frame geladen, der die volle Fensterfläche ausnutzt, der andere Frame besitzt keine Größe. In diesem anderen Frame wird dann eine Seite geladen, die keinen Inhalt besitzt, möglichst klein ist, und sich in regelmäßigen Abständen automatisch neu lädt. Somit wird der Server auch in regelmäßigen Abständen kontaktiert.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Titel der Seite</title>
</head>
<frameset rows="100%,0%" frameborder="0" framespacing="0" border="0">
<frame src="eigentliche_seite.html" name="seite" noresize>
<frame src="besucher_online_zaehler.php" name="leerframe" noresize>
<noframes>
<p>Diese Webseite ist auch <a href="eigentliche_seite.html">ohne Frames</a> verfügbar.</p>
</noframes>
</frameset>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta http-equiv="Refresh" content="270; URL=besucher_online_zaehler.php"> <title>Titel der Seite</title> </head> <body> <?php // einbinden der Datei zum Zählen der Besucher, die Online sind require 'user_online.php'; // diesen Besucher zählen zaehle_besucher ($_SERVER['REMOTE_ADDR']); ?> </body> </html>
Das Frameset wird statt der eigentlichen Startseite aufgerufen. Die Startseite ist nun unter eigentliche_seite.html zu erreichen. Diese wird im Frameset auch eingebunden. Zusätzlich wird eine Seite besucher_online_zaehler.php eingebunden. Diese Seite lädt sich über einen
Refresh-Metatag neu. Im PHP-Teil wird zuerst die Datei für das Zählen der Besucher aus dem ersten Lösungsvorschlag eingebunden, danach wird die Funktion zum Zählen des Besuchers aufgerufen. Eine Ausgabe wird nicht produziert.
Falls eine Unterseite über eine Suchmaschine gefunden wird, dann muss das Frameset nachgeladen werden. Damit dies automatisch geschieht, ist zwangsläufig Javascript vonnöten. Damit die vorher aufgerufene Seite nach dem Laden des Framesets jedoch wieder erscheint (und nicht die Startseite), gibt es fertige Lösungen in
JavaScript und
PHP sowie Perl.
Der dritte Lösungsvorschlag besitzt auch diverse Nachteile:
Die Realisierung einer Anzeige der Anzahl der Besucher, die im Moment online sind, ist nicht möglich. Man kann mit verschiedenen Ansätzen eine grobe Schätzung dieser Anzahl durchführen. Je mehr Besucher jedoch gleichzeitig auf eine Seite zugreifen, desto ungenauer wird diese Anzeige. Die Anzeige ist nur dann genau, wenn sich gar kein Besucher auf der Seite befindet.
Wenn Sie sich dennoch entscheiden, so eine Anzeige auf Ihrer Seite einzubauen, dann dürfen Sie die hier veröffentlichten Scripte gerne dazu verwenden. Die Dateien user_online.php und UserOnline.pm stehen zum Download bereit, die Einbindung an die eigene Seite kann aus den hier im Artikel gegebenen Beispielen erschlossen werden.
Hinweis: Unter Windows 95, Windows 98 und Windows Millenium Edition ist es nicht möglich, Dateisperren einzurichten. Dies gilt sowohl für PHP als auch für Perl. Die Perl-Variante von der Funktion flock produziert eine Fehlermeldung. Sie sollten daher die Zeilen, die diese Funktion beinhalten, auskommentieren oder löschen, falls Sie so ein System verwenden. Unter anderen Betriebsystemen, einschließlich Windows NT 4.0, Windows 2000, Windows XP und Linux, sind Dateisperren dagegen möglich. Nachdem auf Servern im Normalfall nur Betriebsysteme laufen, die Dateisperren unterstützen, habe ich Dateisperren verwendet. Die PHP-Variante ist nicht betroffen, da die PHP-Version nur false zurückgibt.