Hallo
ich habe da folgendes Script im Netz gefunden:
ein klein wenig eingerückt und etwas kommentiert
<?php
// Initialisiere ein paar Variablen
// Datei, auf die zugegriffen wird,
$daten="besucher.txt";
// aktueller Zeitpunkt als UNIX-Timestamp
$time = time();
// IP-Adresse, von der die aktuelle Anforderung kommt
// Nutze das superglobale $_SERVER-Array
// Noch besser: verzichte auf das Umkopieren :-)
$ip = getenv("REMOTE_ADDR");
// 5 Minuten Ablaufzeit
// Variablen in Strings zu konvertieren, um damit zu rechnen,
// ist extrem mieser Stil
$ablaufzeit = "$time"-"300";
// Besser und leichter lesbar wäre
# $ablaufzeit = $time - 300;
// Einlesen der oben angegebenen Datei in ein Array von Zeichenketten
// Ignoriere gegebenenfalls auftretende Fehlermeldungen
$pruefung = @file($daten);
// Verarbeitung der Daten (mit vielen - überflüssigen - Lese- und
// Schreiboperationen auf der angegebenen Datei
// 1. Schritt:
// Werfe alle Zeilen aus der Datei, deren Ablaufzeit vorbei ist.
// Anmerkung: while (list ... each) ist Uraltstil aus Zeiten von PHP 3
// Dafür gibt es foreach
while (list ($line_num, $line) = @each ($pruefung))
// Betrachte jede einzelne Zeile der Reihe nach
// und splitte sie am Trennzeichen "&&" auf
// Die Einträge wandern ins Array $zeiten
$zeiten = explode("&&",$line);
// Falls der erste Eintrag vor der Ablaufzeit liegt
if ($zeiten[0] <= $ablaufzeit) {
// Öffne die Datei, die bereits eingelesen in $pruefung
// vorliegt, erneut. Und nur zum Lesen.
$fp = fopen( "$daten", "r" );
// Lies die ganze Datei (die immer noch in $pruefung
// vorliegt) nochmals in die Variable $contents ein
$contents = fread($fp, filesize($daten));
// Schliesse die Datei
fclose($fp);
// Anmerkung:
// Seit PHP 4.3.0. könntest Du die drei Anweisungen durch den
// Aufruf von [link:http://www.php.net/manual/de/function.file-get-contents.php@title=file_get_contents()] ersetzen. Da der
// Inhalt aber sowieso schon eingelesen vorliegt, ist es unnötig,
// die Datei erneut einzulesen :-)
// Nun quoten wir den Inhalt der aktuellen Zeile. Wozu?
// Glücklicherweise gibt es gar kein Zeichen, das von quotemeta
// behandelt werden würde.
$line=quotemeta($line);
// Wir nehmen einen Leerstring
$string2 = "";
// Ersetze im Inhalt der Datei die gequotete Zeile,
// falls sie gefunden wird, durch den Leerstring.
// a) gibt es [link:http://www.php.net/manual/de/function.preg-replace.php@title=preg_replace()]
// b) sollte nichts gefunden werden, wenn gequotet werden musste
$replace = ereg_replace($line, $string2, $contents);
// Jetzt öffnen wir die Datei zum Schreiben
// Dass es nicht funktionieren könnte, wird ignoriert
$fh=fopen($daten, "w");
// Wir sperren die Datei exklusiv - uralter PHP-3-Stil
// Dass es zu spät ist, steht in Christians Artikel, den ich Dir
// schon verlinkt habe.
@flock($fp,2);
// und schreiben den geänderten Inhalt weg
// und das wiederholen wir für jede Zeile, die abgelaufen ist,
// statt es wenigstens in einem Rutsch zu erledigen.
fputs($fh, $replace);
// heben die Sperre auf
@flock($fp,3);
// und schließen die Datei
fclose($fh);
}
}
// 2. Schritt:
// Suche einen eventuell vorhandenen Eintrag mit der aktuellen IP-Adresse
// und lösche diesen Eintrag
// Wir lesen die geänderte Date erneut ein.
// Ignorieren, dass das fast so in $replace steht und ignorieren genauso
// stur gegebenenfalls auftretende Fehler
$ippruefung = @file($daten);
// Diese Prüfung erfolgt analog zum ersten Schritt, meine Anmerkungen
// gelten in gleichem Maße - ich verzichte darauf, sie zu wiederholen.
while (list ($line_num, $line) = @each ($ippruefung)) {
$ips = explode("&&",$line);
if($ips[1] == $ip) {
$fp = fopen( "$daten", "r" );
$contents = fread($fp, filesize($daten));
fclose($fp);
$line = quotemeta($line);
$string2 = "";
$replace = ereg_replace($line, $string2, $contents);
$fh=fopen($daten, "w");
@flock($fp,2);
fputs($fh, $replace);
@flock($fp,3);
fclose($fh);
}
}
// 3. Schritt
// Füge einen neuen Eintrag mit der akutellen IP und dem aktuellen
// Zeitstempel am Ende der Datei hinzu.
$fp = fopen("$daten", "a+");
flock($fp,2);
// Jeder Eintrag ist von der Form:
// Zeitstempel && IP-Adresse && Zeilenende
// ohne die Leerzeichen, die ich der Übersicht halber eingefügt habe.
// schreibe eine Zeile ans Ende der Datei
fputs ($fp, "$time&&$ip&&\n");
flock($fp,3);
// Schliesse die Datei
fclose ($fp);
// 4. Schritt
// Ermittle die Anzahl der Zeilen der Datei, das ist die Anzahl der
// Besucher, die derzeit "online" sind.
// Dazu wird die Datei schon wieder eingelesen.
$anzahldaten = file($daten);
$anzahl = count($anzahldaten);
echo "$anzahl User online";
?>
Nur hätte ich es jetzt gerne so, das das Script mir die Anzahl der Online User nicht nur aktuell auf der Seite anzeigt, sondern auch in eine user.txt schreibt.
Prinzipiell reichte es, am Ende den Inhalt der Variablen in die Datei user.txt zu schreiben. Wenn der Schreibvorgang erfolgreich war, hast Du Dein Ziel erreicht. Allerdings wäre es doch ein guter Ansatz, das Skript hier sauber zu überarbeiten. - Dabei solltest Du Dir überlegen, wie Du die Einzelschritte cleverer und übersichtlicher gemäß dem
E ingabe
V erarbeitung
A usgabe
EVA-Prinzip gestalten kannst. Ein schönes Projekt, um den Einstieg in eine Programmiersprache wie PHP zu schaffen. Viel Erfolg!
Freundliche Grüße
Vinzenz