Webseiten Statistik mit TYPO3 - Teil 1
Zur Messung der Seiten Besucher und der Erstellung von Webseiten Statistiken wird vielfach google analytics oder Matomo (Piwik) eingesetzt. Beide Tools können DSGVO konform konfiguriert werden und bieten eine umfassende Analyse über das Nutzerverhalten.
Wozu also ein eigenes Tool?
Ich erlebe in der Praxis immer wieder, das Kunden diese Tools “haben wollen”, aber am Ende gar nicht nutzen. Seitenstatistiken und SEO werden meist in kleineren bis mittleren Projekten von “irgendwem” nebenbei mehr oder weniger erledigt, und wer eine Webseitenbesucher Statistik braucht, fragt die beim Entwickler an … Die Tools sind für viele Projekte oversized und für den Gelegenheitsanwender eher verwirrend als hilfreich.
Web Analyse im TYPO3 Backend
Eine einfache und datenschutzkonforme Besucherstatistik direkt im TYPO3 Backend ist für viele kleinere Anwendungen hilfreicher als einen Datenfriedhof bei den üblichen third-party Tools. Natürlich kann man auch die Daten der externen Tools über Schnittstellen in das TYPO3 System anbinden, aber für einfache Auswertungen geht das auch mit TYPO3 bzw. PHP Bordmitteln.
Ein Ansatzpunkt ist die PSR-4 Middleware. Der HTTP Header der Server Anfragen liefert uns ausreichende Informationen für eine einfache Webstatistik.
Doch bevor ich mich in technischen Details verliere stellt sich die Frage, welche Kennzahlen sind überhaupt von Interesse und wie kann das Datenmodeling aussehen.
Kennzahlen und Datenmodeling
Die Kennzahlen ergeben sich aus den W-Fragen:
- Wieviele Besucher hat meine Seite?
- Welche Inhalte / Seiten werden gelesen?
- Woher kommen die Besucher?
- Womit wird die Seite aufgerufen (Mobil / Desktop)?
Weitere Analysen wie die Besuchsdauer, wiederkehrende Besucher usw können nicht direkt aus dem Request ermittelt werden und brauchen in der Regel ein Cookie.
Nun könnte man auf die Idee kommen, die Header Daten jedes einzelnen Seitenaufrufs zu speichern. Bei einer mittlegroße Webseite mit 30 tsd Seitenaufrufe und nochmal halb sovielen BOTs wären das im Monat 45 tsd Datenbankeinträge, auf 10 Jahre gerechnet über 5 Millionen.
Der nächste Datenfriedhof.
Orientieren wir uns an den gewünschten Kennzahlen, ergibt sich folgende Datenstruktur:
- Tabelle 1 - tägliche Besucher Datenfelder: Datum, Counter
- Tabelle 2 - Inhalte Datenfelder: Monat, Seiten ID, Counter
- Tabelle 3 - Refer Datenfelder: Monat, Refer, Counter
- Tabelle 4 - User Agent Datenfelder: Monat, Agent, Counter
Tabelle 1 würde also 30 bzw 31 Einträge je Monat brauchen.
Tabelle 2 ist abhängig der Anzahl der Seiten im Webprojekt, gehen wir von 100 Seiten aus, entspricht das auch maximal 100 Datensätze.
Die Anzahl der Refers in Tabelle 3 ist schwierig zu schätzen, aber mehr als 300 unterschiedliche Refers sind eher selten bei 30 tsd Besuchern.
Der User Agent in Tabelle 4 wird gefiltert auf die Werte Android, iPhone + iPad, Mac, Windows und sonstige.
Insgesamt würden wir somit ca. 535 Datensätze im Monat produzieren, auf 10 Jahre gerechnet gut 64 tsd Datenbankeinträge. Schon besser als der Datenfriedhof bei der Einzelspeicherung.
Die HTTP Header Daten
Über das ServerRequestInterface können alle benötigten Daten direkt ausgelesen werden.
$request->getServerParams()
Der veraltete Aufruf mittels \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv() ist nicht mehr erforderlich, siehe TYPO3 Doku.

Aus den HTTP Header Daten des Requests brauchen wir nur den HTTP_USER_AGENT und HTTP_REFERER. Der HTTP_SEC_CH_UA_PLATFORM Header würde zwar direkt das Betriebssystem des Client liefern, wird aber leider nicht von allen Browsern unterstützt.
Die Middleware Klasse
Im Verzeichnis Classes/Middleware unserer Extension legen wir eine neue Klasse an, ich nenne sie FrontendStatisticsMiddleware.
Für die ersten Tests reicht folgende Funktion:
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
class FrontendStatisticsMiddleware implements MiddlewareInterface
{
/**
* @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler
* @return ResponseInterface
* @throws SiteNotFoundException
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
//$agent = $request->getServerParams()['HTTP_USER_AGENT'];
//$refer = $request->getServerParams()['HTTP_REFERER'];
return $handler->handle($request);
}
}Damit die Klasse auch geladen wird, muss sie unter Configuration/RequestMiddlewares.php noch angemeldet werden:
use Vendor\Extension\Middleware\FrontendStatisticsMiddleware;
/**
* Definitions for middlewares provided by my extension
*/
return [
'frontend' => [
'vendor/extension/frontend-statistics' => [
'target' => FrontendStatisticsMiddleware::class,
'after' => [
'typo3/cms-frontend/tsfe',
],
],
],
];