Ein (wirklich) einfacher Counter

Obwohl ich selber kein Freund offensichtlicher Counter bin, kann es für den Einen oder Anderen doch ein interessantes Gimmick auf der eigenen Website sein: Der Besucherzähler.

Im folgenden Artikel werde ich einen kleinen, einfachen Counter vorstellen, der ohne Datenbank auskommt und mit ein paar Zeilen PHP schnell selbst geschrieben ist.
Der Counter speichert den Zählerstand in einer einfachen Textdatei auf dem Server und sollte somit in den meisten Serverumgebungen funktionieren. Zudem legt dieser Counter einen Cookie auf dem Rechner des Besuchers ab und verhindert so, dass ein und derselbe Besucher (binnen einer Stunde) mehrfach gezählt wird.

UPDATE: Ich habe die Anfrage eines Lesers im Januar 2020 als Anlass genutzt, eine aktualisierte Version des Counter-Skripts zu schreiben, welches – im Gegensatz zur alten Version keine IP-Adressen verarbeitet. Dieses befindet sich am Endes Artikels – ich lasse die alte Version lediglich aus Legacy-Gründen hier stehen, rate aber dringend davon ab diese heute noch zu verwenden. Hier gehts direkt zum Update vom 10.01.2020.

Schritt 1: Besucher zählen

Der folgende Code-Schnipsel prüft zunächst, ob auf dem Client der Cookie mit der hinterlegten IP-Adresse existiert.

  • Existiert der Cookie nicht, so wird er angelegt – wobei die aktuelle IP-Adresse des Besuchers im Cookie gespeichert und die Gültigkeitsdauer des Cookie auf eine Stunde festgesetzt wird.
    Anschliessend wird der Zählerstand um eins erhöht
  • Ist der Cookie bereits vorhanden, wird die dort gesicherte IP-Adresse mit der aktuellen verglichen und NUR dann der Zählerstand erhöht, wenn diese voneinander abweichen
//IP-Adresse aus Cookie lesen (wenn vorhanden)
$user_ip = $_COOKIE["user_ip"]; 
//Dateiname der Zaehlerdatei festlegen
$counterfile = "counter.txt"; 
//Zaehlerdatei auslesen und Inhalte in $filehandle speichern
$filehandle = file($counterfile); 

//RELOADSPERRE - Nutzer nicht doppelt zaehlen
//Wenn $user_ip leer ist (Nutzer bisher nicht erfasst)...
//...dann...
if(!$user_ip) 
    { 
    //Cookie erzeugen, welcher die aktuelle IP-Adresse und
    //die Ablaufzeit enthaelt: 360000 Millisekunden = 1 Stunde 
    setcookie("user_ip", $_SERVER['REMOTE_ADDR'], time()+360000); 
    //Inhalt der Zaehlerdatei (eine Zahl) um eins erhoehen
    $filehandle[0]++; 
    //Datei oeffnen, schreiben, schliessen
    $cf = fopen($counterfile, "w+"); 
    fputs($cf, "$filehandle[0]"); 
    fclose($cf); 
    } 
//...sonst...($user_ip nicht leer, aber IP-Adresse weicht ab)
elseif($user_ip != $_SERVER['REMOTE_ADDR']) 
    { 
    //Inhalt der Zaehlerdatei (eine Zahl) um eins erhoehen
    $filehandle[0]++; 
    //Datei oeffnen, schreiben, schliessen
    $cf = fopen($counterfile, "w+"); 
    fputs($cf, "$filehandle[0]"); 
    fclose($cf); 
    }

Damit wäre der erste Schritt erledigt: Der Besucher wurde gezählt (wenn er die Bedingungen erfüllt hat) und der aktuelle Zählerstand in der Zählerdatei „counter.txt“ gespeichert.

Schritt 2: Zählerstand ausgeben

Nun muss nur noch an der gewünschten Stelle innerhalb der Website der Zählerstand ausgegeben werden. Das Auslesen UND Ausgeben der Zählerdatei übernimmt folgende kurze Code-Zeile:

<?php
readfile("counter.txt");
?>

Alternativ lässt sich die Zahl auch mit einer festen Anzahl an Stellen ausgeben, was aus Gründen des Layouts oft sinnvoller ist. Hierfür steht in PHP die Funktion „printf()“ zur Verfügung. Statt „3“ lässt sich so auf einfache Weise „003“ ausgeben.

<?php
$filehandle=file("counter.txt");
//printf() gibt formatierten String aus - %0Xd - X=Anzahl der Stellen
printf("%03d",$filehandle);
?>

Fazit

Auf diese Weise lässt sich recht schnell ein einfacher Counter realisieren. Jedoch sollte die damit ermittelte Besucherzahl mit äußerster Vorsicht genossen werden, da das mehrfache Zählen eines Benutzers nicht vollständig ausgeschlossen werden kann und das Ergebnis manipulierbar ist.

Eine erheblich bessere Analyse des Besucheraufkommens bietet ein regelmäßiger Blick in die Logfiles oder in die Analysetools der Webhoster. Dort findet man oft grafisch aufbereitete Daten, welche schneller und besser Rückschlüsse auf die Besucher zulassen.

Fehler gefunden oder Verbesserungsvorschläge? Bitte die Kommentarfunktion benutzen!

Update 10.01.2020

Aufgrund einer Anfrage eines Lesers im Januar 2020, hab ich eine neue Version des Skriptes erstellt, die keine IP-Adresse mehr verarbeitet:

// -- CONFIGURATION -------------------------
// define file for counting hits
$counterfile = "count.txt"; 

// define name of cookie
$cookiename = 'ctd';

// define cookie lifetime in seconds
$cookielifetime = 36000;



// -- PROCESSING ----------------------------
// read counterfile if exist (set content to 0 if not)
if(file_exists($counterfile)){
    $file_contents = file($counterfile); 
} else {
    $file_contents[0] = 0;
}

// check if users was NOT already counted (cookie not set)
if(!array_key_exists($cookiename,$_COOKIE)){
    // set cookie
    setcookie($cookiename, "1", time()+$cookielifetime);
    // increase count
    $file_contents[0]++;
    // write new count to file
    $cf = fopen($counterfile, "w+"); 
    fputs($cf, $file_contents[0]); 
    fclose($cf); 
}

Im oberen Teil des Skriptes kann die Datei für die Speicherung des Zählerstandes ($counterfile), der Name des Cookies ($cookiename) sowie dessen Speicherdauer in Sekunden ($cookielifetime) definiert werden. Die Speicherdauer des Cookies kann auch auf 0 gesetzt werden – dann ist der Cookie ein s.g. Session-Cookie und wird beim Beenden der Nutzungssitzung bzw. Schließen des Browsers wieder gelöscht.

Tipp: Counter-Skript asynchron aufrufen

Da Cookies im HTTP-Response-Header an den Browser übertragen werden, muss das o.g. Codeschnipsel vor jeglicher Ausgabe aufgerufen werden. Da das nicht in allen Fällen unkompliziert machbar ist, kann das Counter-Skript auch asynchron via Javascript aufgerufen werden. Dazu wird der o.g. Codeschnipsel zunächst in einer eigenen Datei gespeichert – nennen wir sie mal counter.php – und anschließend das nachfolgende Javascript irgendwo in einem script-Element auf der Seite platziert. Ich empfehle dies am Ende der Seite einzufügen, vor dem schließenden </body>-Tag.

// send request to counter script
var counterreq = new XMLHttpRequest();
counterreq.open("GET","counter.php"); // adjust URL if necessary
counterreq.send();

Danke an J.K. für das Testen des neuen Skriptes!

1 Kommentar Schreibe einen Kommentar

Schreibe einen Kommentar

Personenbezogene Daten interessieren mich nicht – daher ist die Angabe von Name und E-Mail-Adresse freiwillig. Jedoch wird jeder Kommentar von mir geprüft, bevor er freigeschalten wird.