Besucherzähler
Counterstand-Datei
Ausser den komplexen, Datenbank gestützten, vorgefertigten Besucherzählern (Besucherstatistiken), habe ich zwei Scripts gefunden, die einfach nachvollziehbar sind und einen Lerneffekt ermöglichen. Sie speichern den Zwischenstand in einfachen Textdateien (statt Datenbank).
Jeder Hit zählt
Dieses Script z.B. in die Index-Datei tun. Es liest und überschreibt eine 'counterstand.txt' Datei, welche vorhanden sein muss, im selben Ordner wie der Index. Jedes Öffnen oder Aktualisieren der beherbergenden Seite erhöht den Zählerstand. Den Anfangswert kann ich einfach in der counterstand.txt vorgeben. Ich darf nicht vergessen der Datei Schreibberechtigung zu erteilen (chmod).
fopen()
fgets() rewind() fwrite()
fclose()
<?php
# Danke Claudia Schaffarik - www.schattenbaum.net
// die Cursorposition in einer mittels 'fopen' zu oeffnenden (vorhandenen) Datei 'counterstand.txt'
// der Oeffnungs-Modus ist lesen und schreiben 'r+', der Cursor geht an den Anfang der Datei
$cursor = fopen("counterstand.txt","r+");
// den Wert speichern, den wir durch 'fgets' ab der Coursorposition 10 Zeichen weit gelesen haben
$counterstand = fgets($cursor, 10);
// wenn die Datei neu ist, wir 0 vorgegeben
if($counterstand == "") {
$counterstand = 0;
}
// der Wert wird um 1 erhoet
$counterstand++;
// der Wert wird jetzt ausgegeben
echo "Es sind $counterstand Hits auf diese Seite.";
// der Cursor wird wieder an den Dateianfang zurückgespult
rewind($cursor);
// mittels 'fwrite' überschreiben wir den alten Wert, welchen wir erhoet hatten
fwrite($cursor, $counterstand);
// mittels 'fclose' schliessen wir die Datei in welcher wir den Cursor haben
fclose($cursor);
?>
Reload Sperre
Das obige Script zählt unkontrolliert jeden Hit, auch wenn jemand nur die Seite aktualisiert (Reload). Das folgende Script speichert und vergleicht die IP-Adresse innerhalb einer gewissen Zeitspanne.
<?php
/////////////////////////////////////////
// Counter + Reloadsperre v1.0
// von http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=229&group=39
/////////////////////////////////////////
// 0=keine Reloadsperre, 1=Reloadsperre
$aktiv = 1;
// Zeitspanne der Reloadsperre in Minuten
$zeit = 30;
// IP-Datei
$ipdatei = "countr_ips.txt";
// Counterdatei
$datei = "countr_count.txt";
// Anzahl der führenden Nullen
$stellen = 5;
// Festlegen der Bild-Dimensionen
$breite="15";
$hoehe="19";
/////////////////////////////////////////
// IP-Reloadsperre
/////////////////////////////////////////
function pruf_IP($rem_addr) {
global $ipdatei,$zeit;
@$ip_array = file($ipdatei);
$reload_dat = fopen($ipdatei,"w");
$this_time = time();
for ($i=0; $i<count($ip_array); $i++) {
list($ip_addr,$time_stamp) = explode("|",$ip_array[$i]);
if ($this_time < ($time_stamp+60*$zeit)) {
if ($ip_addr == $rem_addr) {
$gefunden=1;
}
else {
fwrite($reload_dat,"$ip_addr|$time_stamp");
}
}
}
fwrite($reload_dat,"$rem_addr|$this_time\n");
fclose($reload_dat);
return ($gefunden==1) ? 1 : 0;
}
/////////////////////////////////////////
// Counter-Abfrage
/////////////////////////////////////////
if (file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($_SERVER['REMOTE_ADDR'])==0))) {
// Falls die Datei existiert, wird sie ausgelesen und
// der dort enthaltene Wert um Eins erhöht.
$fp=fopen($datei,"r+");
$zahl=fgets($fp,$stellen);
$zahl++;
rewind($fp);
flock($fp,2);
fputs($fp,$zahl,$stellen);
flock($fp,3);
fclose($fp);
}else if (!file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($_SERVER['REMOTE_ADDR'])==0))) {
// Die Datei counter.txt existiert nicht, sie wird
// neu angelegt und mit dem Wert 1 gefüllt.
$fp=fopen($datei,"w");
$zahl="1";
fputs($fp,$zahl,$stellen);
fclose($fp);
} else {
// Die Datei existiert zwar, jedoch handelt
// es sich wahrscheinlich um den gleichen Besucher
$fp=fopen($datei,"r");
$zahl=fgets($fp,$stellen);
fclose($fp);
}
$zahl=sprintf("%0".$stellen."d",$zahl);
// $zahl kann nun ausgegeben werden
?>
Zur weiteren Verfeinerung des Zählers, könnte ich nun noch die Roboter/Crawler/Spiders (nicht menschliche Besucher) von der Zählung ausschliessen.