Zähler einbauen

Besucherzähler mit HTML und PHP selbst erstellen

Ein eigener Zähler braucht keine zwanzig Zeilen PHP. Er läuft auf Ihrem Webspace, setzt keine Cookies und schickt keine Daten an Dritte. Diese Anleitung zeigt den vollständigen Code und die typischen Stolperfallen.

Bildschirm mit farbig hervorgehobenem HTML- und SVG-Quelltext

Auf einen Blick

  • Reines HTML kann nicht zählen. Es braucht immer ein Programm auf einem Server, etwa ein kleines PHP-Skript.
  • Der Zähler unten speichert nur eine Zahl in einer Textdatei. Er setzt keine Cookies und speichert keine IP-Adressen.
  • Eine Dateisperre (flock) verhindert, dass gleichzeitige Aufrufe den Zählerstand überschreiben.
  • Auf Baukästen ohne PHP (z. B. Jimdo oder Wix) bleibt nur die Statistik des Baukastens oder ein fremder Dienst.

Warum reines HTML nicht zählen kann

HTML ist eine Beschreibungssprache: Es legt fest, was auf einer Seite steht, kann aber nichts speichern und nichts berechnen. Ein Besucherzähler muss sich bei jedem Aufruf eine Zahl merken und sie erhöhen. Das gelingt nur mit einem Programm, das auf dem Server läuft, bevor oder während die Seite ausgeliefert wird.

Auf den meisten Webspace-Paketen ist dafür PHP vorinstalliert. Sie brauchen also keinen fremden Dienst, keine Datenbank und kein Konto bei einem Anbieter. Eine Textdatei für den Zählerstand und ein kurzes Skript genügen.

Ob Ihr Paket PHP unterstützt, sehen Sie in der Verwaltungsoberfläche Ihres Hosters, meist unter einem Punkt wie „PHP-Version“ oder „Skriptsprachen“. Reine Baukasten-Websites (Jimdo, Wix, Squarespace und ähnliche) erlauben dagegen keine eigenen Server-Skripte; dazu unten mehr.

Der Zähler: zaehler.php

Legen Sie im Hauptverzeichnis Ihrer Website eine Datei zaehler.php mit folgendem Inhalt an:

<?php
declare(strict_types=1);

/**
 * Erhöht den Zählerstand um eins und gibt den neuen Stand zurück.
 * Speichert nur eine Zahl, keine IP-Adressen und keine Cookies.
 */
function besucher_zaehlen(string $datei = __DIR__ . '/daten/zaehler.txt'): int
{
    // Bekannte Bots und leere User-Agents nicht mitzählen
    $agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $istBot = $agent === '' || preg_match('/bot|crawl|spider|slurp|preview/i', $agent) === 1;

    $fp = fopen($datei, 'c+');
    if ($fp === false) {
        return 0;
    }
    flock($fp, LOCK_EX);
    $stand = (int) stream_get_contents($fp);
    if (!$istBot) {
        $stand++;
        ftruncate($fp, 0);
        rewind($fp);
        fwrite($fp, (string) $stand);
        fflush($fp);
    }
    flock($fp, LOCK_UN);
    fclose($fp);

    return $stand;
}

Was die einzelnen Teile tun:

  • fopen($datei, 'c+') öffnet die Datei zum Lesen und Schreiben und legt sie an, falls sie fehlt, ohne vorhandenen Inhalt zu löschen.
  • flock($fp, LOCK_EX) sperrt die Datei, solange gezählt wird. Ohne diese Sperre könnten zwei gleichzeitige Aufrufe denselben alten Stand lesen, und einer der beiden ginge verloren.
  • Der Bot-Filter ignoriert Anfragen, deren Browserkennung typische Begriffe wie „bot“ oder „crawl“ enthält. Er ist bewusst grob: Er erkennt die großen Suchmaschinen-Crawler, aber nicht jeden schlecht programmierten Bot.

Legen Sie anschließend den Ordner daten an und sorgen Sie dafür, dass PHP dort schreiben darf. Bei den meisten Hostern ist das ohne weitere Einstellung der Fall.

Die Zählerdatei schützen

Die Datei zaehler.txt liegt im Webverzeichnis und wäre theoretisch unter ihre-domain.de/daten/zaehler.txt abrufbar. Das ist harmlos, weil sie nur eine Zahl enthält, aber unsauber. Auf Apache-Servern sperrt eine Datei daten/.htaccess mit diesem Inhalt den Zugriff:

Require all denied

Noch besser ist ein Ordner außerhalb des Webverzeichnisses, wenn Ihr Hoster das erlaubt. Dann passen Sie den Pfad in der ersten Zeile der Funktion an.

Variante A: Zähler in einer PHP-Seite anzeigen

Ist Ihre Seite bereits eine .php-Datei, binden Sie den Zähler direkt ein:

<?php require __DIR__ . '/zaehler.php'; ?>
<p class="zaehler">
  Diese Seite wurde <?= number_format(besucher_zaehlen(), 0, ',', '.') ?> Mal aufgerufen.
</p>

number_format setzt die deutschen Tausenderpunkte, aus 12345 wird „12.345“. Jeder Aufruf der Seite erhöht den Stand um eins.

Variante B: Zähler auf einer reinen HTML-Seite

Soll Ihre Seite eine .html-Datei bleiben, holt ein kleines JavaScript den Zählerstand von einem PHP-Skript ab. Legen Sie dafür eine zweite Datei zaehler-api.php an:

<?php
declare(strict_types=1);
require __DIR__ . '/zaehler.php';

header('Content-Type: text/plain; charset=utf-8');
header('Cache-Control: no-store');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit;
}
echo number_format(besucher_zaehlen(), 0, ',', '.');

In Ihre HTML-Seite fügen Sie an der gewünschten Stelle ein:

<p class="zaehler">Aufrufe: <span id="zaehler">–</span></p>
<script>
  fetch('/zaehler-api.php', { method: 'POST' })
    .then((antwort) => antwort.text())
    .then((stand) => {
      document.getElementById('zaehler').textContent = stand;
    })
    .catch(() => {});
</script>

Der Zähler reagiert nur auf POST-Anfragen. So erhöhen Suchmaschinen-Crawler, die eine Adresse einfach abrufen, den Stand nicht, und Zwischenspeicher liefern keinen veralteten Wert aus. Ein Nebeneffekt: Besucher ohne JavaScript und die meisten Bots werden gar nicht gezählt. Für eine Statistik ist das eher ein Vorteil.

Unsichtbar zählen

Wenn Sie die Zahl nur für sich wissen, aber nicht anzeigen wollen, lassen Sie das <span> weg und rufen fetch trotzdem auf. Den Stand lesen Sie dann direkt in der Datei zaehler.txt über den Dateimanager Ihres Hosters.

Zahl als Ziffernfeld gestalten

Mit wenigen Zeilen CSS sieht der Zähler aus wie die klassischen Ziffernrollen:

.zaehler span {
  font-family: ui-monospace, monospace;
  background: #0d1b2a;
  color: #fff;
  padding: 0.15em 0.4em;
  border-radius: 4px;
  letter-spacing: 0.15em;
}

Was dieser Zähler zählt und was nicht

Der Zähler erfasst Seitenaufrufe. Er unterscheidet nicht zwischen neuen und wiederkehrenden Besuchern, denn dafür müsste er Besucher wiedererkennen, etwa per Cookie. Das ist eine bewusste Entscheidung: Ein Cookie für die Reichweitenmessung erfordert in Deutschland in der Regel eine Einwilligung. Warum, erklärt der Ratgeber Besucherzähler und Datenschutz.

Welche Zahl Sie mit welcher Methode erhalten, zeigt das Beispiel im Ratgeber Besucher, Sitzungen und Seitenaufrufe.

Wenn es nicht funktioniert

SymptomHäufige UrsacheLösung
Es erscheint der PHP-Code statt einer ZahlDie Seite endet auf .html, der Server führt darin kein PHP ausDatei in .php umbenennen oder Variante B nutzen
Der Zähler bleibt bei 0PHP darf den Ordner daten nicht beschreibenSchreibrechte im Dateimanager des Hosters prüfen
Die Zahl springt nicht weiterEin Caching-Plugin oder der Hoster liefert eine gespeicherte Kopie der Seite ausVariante B verwenden, die API sendet Cache-Control: no-store
Fehlermeldung „headers already sent“Vor <?php in zaehler-api.php steht ein Leerzeichen oder eine LeerzeileDatei so speichern, dass sie direkt mit <?php beginnt

Baukästen ohne PHP

Jimdo, Wix, Squarespace und ähnliche Baukästen erlauben zwar HTML-Elemente, führen aber keine eigenen Server-Skripte aus. Dort haben Sie zwei Möglichkeiten: die eingebaute Statistik des Baukastens, die viele Tarife mitbringen, oder ein fremder Zählerdienst, dessen Grafik oder Skript Sie über ein HTML-Element einbinden. Für Letzteres gilt unsere Checkliste für kostenlose Besucherzähler.

Bei WordPress sieht es anders aus: Dort läuft PHP ohnehin. Wie Sie dort zählen, ohne ein großes Statistik-Plugin zu installieren, steht im Ratgeber Besucherzähler in WordPress.

Häufige Fragen

Kann ich einen Besucherzähler nur mit HTML bauen?

Nein. HTML beschreibt nur, wie eine Seite aussieht; es kann keine Werte speichern. Zum Zählen braucht es ein Programm, das bei jedem Aufruf auf dem Server läuft. Auf normalem Webspace ist das meist PHP. Ihre Seite kann trotzdem eine .html-Datei bleiben, wenn sie den Zählerstand per JavaScript von einem PHP-Skript abholt.

Warum steigt mein Zähler bei jedem Neuladen?

Weil er Seitenaufrufe zählt, nicht Personen. Um wiederkehrende Besucher zu erkennen, müsste der Zähler sie wiedererkennen, etwa per Cookie. Das erfordert in der Regel eine Einwilligung. Für eine kleine Website ist die Zahl der Seitenaufrufe ohne Cookies meist die ehrlichere Lösung.

Mein Hoster unterstützt kein PHP. Was nun?

Prüfen Sie zuerst, ob das Hosting-Paket eine eingebaute Statistik aus den Server-Logfiles mitbringt. Viele Pakete tun das. Ansonsten bleibt ein fremder Zählerdienst; worauf Sie dabei achten sollten, steht in unserer Checkliste für kostenlose Zähler.

Quellen

  1. PHP-Handbuch: flock – Portables Locking von Dateien The PHP Group · abgerufen am 27. Oktober 2026
  2. PHP-Handbuch: fopen (Modus c+) The PHP Group · abgerufen am 27. Oktober 2026
  3. Fetch API MDN Web Docs · abgerufen am 27. Oktober 2026