Dieses Addon stellt im REDAXO CMS eine serverseitige Besucherzählung bereit und visualisiert die erfassten Metriken im Backend mit ECharts und DataTables.
Erfasst und visualisiert werden unter anderem diese Metriken:
- Tag des Besuches mit Datum und Wochentag
- Besuchszeit
- Browser
- Gerätetyp
- Betriebssystem
- Gerätemarke und Gerätemodell
- Bots und Crawler
- Referrer
- Anzahl besuchter Seiten in einer Sitzung
- Besuchsdauer in einer Sitzung
- Ausstiegsseiten
Das Addon arbeitet ohne clientseitige Cookies.
Die IP-Adresse des Besuchers wird nicht roh gespeichert, sondern gemeinsam mit dem User-Agent gehasht:
hash = sha1(ipAdresseClient + userAgentClient)
Der User-Agent selbst wird nicht auf dem Server gespeichert. Damit lässt sich der Hash nicht direkt einer IP-Adresse zuordnen. Die Hashes werden genutzt, um wiederholte Seitenaufrufe desselben Besuchers nicht mehrfach in die Statistik einfließen zu lassen.
Zur weiteren Datensparsamkeit kann der mitgelieferte Cronjob genutzt werden. Er sollte idealerweise täglich um 00:05 ausgeführt werden und entfernt nicht mehr benötigte Hashes des Vortags.
Medienaufrufe können auf zwei Arten erfasst werden:
- Alle Medienaufrufe werden global mitgeloggt.
- Nur ausgewählte Medien werden über einen Media-Manager-Effekt erfasst.
Über einen API-Request können Frontend- oder Backend-Ereignisse erfasst werden, zum Beispiel Link-Klicks oder Formularversand.
- Repository herunterladen.
- Im Ordner
redaxo/src/addonsentpacken. - Den Ordner in
statisticsumbenennen.
Alternativ kann das Addon über den REDAXO-Installer installiert werden.
Das Addon besteht im Kern aus drei Bereichen:
- Erfassung von Seitenaufrufen, Medienaufrufen und Events
- Aggregation der Rohdaten in Statistik-Tabellen
- Backend-Auswertung mit ECharts und DataTables
Wichtige Dateien und Verantwortlichkeiten:
boot.php: Registrierung von Assets, Hooks und Tracking-Verhalteninstall.php: Datenbankschema und Performance-relevante Indizespages/stats.php: Backend-Startseite mit Overview, Chart-Containern und Lazy-Loading-Metadatenassets/statistics.js: Initialisierung von DateFilter, DataTables, Charts und Lazy Loadinglib/ChartData.php: Hauptaggregationen für Tages-, Monats-, Jahrescharts und Heatmaplib/StatsChartConfig.php: wiederverwendbare Chart-Konfigurationen für zentrale JS-Initialisierunglib/StatsDashboard.php: Komposition der stats-Startseitelib/StatsMainChartSection.php: Renderer für den Hauptchart-Bereich mit Tabs und Collapse-Containernlib/StatsLazySection.php: Renderer für die unteren Lazy-Placeholder der Startseitelib/ListData.php: Tabellen unter den Hauptchartslib/StatsLazyBlockRenderer.php: serverseitiger Renderer für nachgeladene Statistikblöckelib/rex_api_statistics_lazy_block.php: Backend-Endpoint für Lazy-Loading-Blöcke
Die größten Performance-Gewinne der aktuellen Codebasis stammen aus diesen Maßnahmen:
- Datenbankindizes für die tatsächlich genutzten Filter-, Join- und Group-By-Pfade
- Entfernen von N+1-Abfragen in der Chart-Datenaufbereitung
- Wiederverwendung derselben Aggregation für Chart, Tabelle und Detailansicht
- Lazy Loading teurer Backend-Blöcke statt vollständigem Sofort-Rendern
Besonders wichtig sind Indizes für diese Abfragemuster:
date BETWEEN :start AND :end- Gruppierungen nach
date,monthundyear - URL-, Referrer- und Status-Auswertungen
- Domain-Filter für Tages- und Besucherstatistiken
Für sehr lange Felder wie URL und Referrer werden Prefix-Indizes verwendet. Der Grund ist die MySQL-/MariaDB-Key-Length-Grenze bei utf8mb4. REDAXOs Schema-Helper kann diese Prefix-Längen nicht direkt ausdrücken, deshalb werden die betroffenen Indizes in install.php per SQL ergänzt.
Folgende Bereiche wurden bereits gezielt auf Serverlast reduziert:
- Hauptcharts in
lib/ChartData.php - Seiten-, Referrer-, Medien- und Event-Auswertungen
- Detailansichten für URL, Referrer, Medien und Events
- Session-Statistiken wie Seiten pro Sitzung, Besuchsdauer und Ausstiegsseiten
pagestats_data-Auswertungen wie Browser, Gerätetyp, OS, Brand, Model, Hour, Weekday und Country- Overview-Summen auf der Startseite
Die Startseite page=statistics/stats ist bewusst zweistufig aufgebaut.
Beim ersten Seitenaufbau werden synchron geladen:
- Datumsfilter
- Overview-Kennzahlen
- Tageschart
- Heatmap
Erst bei Sichtbarkeit oder Benutzeraktion werden nachgeladen:
- Monats- und Jahreschart beim Öffnen des jeweiligen Tabs
- Geräte- und Client-Statistiken
- erweiterte Session-Statistiken
- Bot-Tabelle
- Tabellen unter den Hauptcharts beim Aufklappen der Collapse-Bereiche
Dadurch bleibt die Seite sofort benutzbar, während schwere Sektionen nur dann Serverzeit verbrauchen, wenn sie tatsächlich geöffnet oder in den Viewport gescrollt werden.
Wenn neue Blöcke auf pages/stats.php ergänzt werden, sollte zuerst entschieden werden, ob sie synchron oder lazy geladen werden müssen.
Faustregel:
- Overview und zentrale Primärcharts: synchron
- große Tabellen, Sekundärcharts und optionale Detailblöcke: lazy
Neue Lazy-Blöcke sollten über StatsLazyBlockRenderer und rex_api_statistics_lazy_block angebunden werden, statt zusätzliche Inline-Abfragen direkt in pages/stats.php einzubauen.
- DataTables werden zentral in
assets/statistics.jsinitialisiert. - Nachgeladene HTML-Blöcke müssen ihre Tabellen nicht selbst initialisieren.
- ECharts-Optionen für Lazy-Blöcke werden serverseitig erzeugt und als JSON ausgeliefert.
- Auch reguläre Unterseiten können Chart-Konfigurationen als JSON-Script aus PHP ausgeben und durch
assets/statistics.jszentral initialisieren lassen. - Die Startseite liefert nur noch eine kleine JSON-Konfiguration aus PHP; die Chart-Initialisierung läuft vollständig im zentralen JS.
Chart und Tabelle sollten nach Möglichkeit immer denselben Datenbestand wiederverwenden. Zusätzliche SQL-Abfragen nur für die zweite Darstellung sind in diesem Addon meist ein Performance-Regression-Muster.
Dieses Addon hat derzeit keine dedizierte Test-Suite. Änderungen sollten mindestens so validiert werden:
- Backend-Seite
statistics/statsmit und ohne Datumsfilter öffnen - Monats- und Jahreschart per Tab-Wechsel prüfen
- Lazy-Blöcke beim Scrollen prüfen
- Collapse-Tabellen unter Tages-, Monats- und Jahreschart öffnen
- Seiten-, Referrer-, Medien- und Event-Details testen
- Installation und Update gegen bestehende Datenbank prüfen
Besonders nach Änderungen an install.php, ChartData.php, ListData.php, assets/statistics.js und pages/stats.php sollte das Verhalten im Backend einmal vollständig geprüft werden.
Falls im Frontend ein Besucher-Counter ausgegeben werden soll, kann zum Beispiel folgende Modul-Ausgabe verwendet werden:
<?php
use AndiLeni\Statistics\VisitorCounter;
?>
<p>Besucher: <code><?php echo VisitorCounter::getText() ?></code></p>Der ausgegebene Text kann anschließend beliebig gestaltet werden.
<?php
use AndiLeni\Statistics\Event;
Event::log('my_event_name');- Im Media Manager einen neuen Medientyp mit dem Namen
loganlegen. - Zu diesem den Effekt
Datei in Statistik loggenhinzufügen. - Ein Modul anlegen.
Eingabe:
<label>Downloads:</label>
REX_MEDIALIST[id="1" widget="1"]
Ausgabe:
<div class="container">
<h2>Downloads:</h2>
<table class="table">
<tr>
<th>Name</th>
<th>Link</th>
</tr>
<?php
foreach (explode(',', 'REX_MEDIALIST[1]') as $img) {
echo '<tr>';
echo '<td>' . $img . '</td>';
echo '<td><a href="' . rex_media_manager::getUrl('log', $img) . '">Download</a></td>';
echo '</tr>';
}
?>
</table>
</div>- In den Einstellungen das Tracking aktivieren.
- Das Beispiel erzeugt dann eine Tabelle, deren Download-Links in der Statistik erfasst werden.
Preview:
Ziel: Das Klicken eines Links im Frontend soll erfasst werden.
- Ein Modul anlegen.
Eingabe:
<label>Kampagnen-Name:</label>
<input type="text" name="REX_INPUT_VALUE[1]" value="REX_VALUE[1]">Ausgabe:
<a class="btn btn-primary" onclick="myFunction()" href="http://example.com/">Link</a>
<script>
function myFunction() {
fetch('/?rex-api-call=stats&name=REX_VALUE[1]');
}
</script>






