Signatur
Beschreibung
VarnishLog ist eine PHP-Klasse aus der PECL-Erweiterung varnish, die es ermöglicht, die Log-Daten eines laufenden Varnish-HTTP-Accelerators direkt aus dessen Shared-Memory-Segment auszulesen. Damit können PHP-Anwendungen Varnish-Aktivitäten in Echtzeit überwachen, ohne externe Tools wie varnishlog aufrufen zu müssen.
Die Klasse ist besonders nützlich für Monitoring-Skripte, Debugging-Werkzeuge oder Log-Aggregatoren, die Varnish-Ereignisse programmatisch verarbeiten möchten. Sie bietet Methoden, um Log-Einträge zeilenweise abzufragen und nach bestimmten Tags oder Transaktions-IDs zu filtern.
Voraussetzung für den Einsatz ist eine installierte und korrekt konfigurierte PECL-varnish-Erweiterung sowie ein laufender Varnish-Daemon, dessen Shared-Memory-Bereich für den PHP-Prozess lesbar ist. Die Klasse arbeitet in einem Pull-Modell: Die Anwendung ruft aktiv Log-Einträge ab, anstatt per Callback benachrichtigt zu werden.
Typische Anwendungsfälle sind das Auslesen von Cache-Hit/Miss-Informationen, das Tracken von Backend-Anfragen oder die Analyse von Client-Transaktionen für Performance-Auswertungen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $args | array | [] | Assoziatives Konfigurations-Array für die Verbindung zum Varnish-Shared-Memory. Unterstützte Schlüssel sind u. a. host (Pfad zum VSM-Socket oder Hostname), port (Port des Varnish-Management-Interfaces) und timeout (Verbindungs-Timeout in Millisekunden). |
Beispiele
Log-Einträge aus Varnish auslesen
<?php
// Verbindung zum lokalen Varnish-Shared-Memory herstellen
$log = new VarnishLog([
'host' => '/var/lib/varnish/hostname/_.vsm',
]);
// Einzelnen Log-Eintrag abrufen
$entry = $log->getLine();
if ($entry !== false) {
echo 'Tag: ' . $entry['tag'] . PHP_EOL;
echo 'VXId: ' . $entry['vxid'] . PHP_EOL;
echo 'Daten: ' . $entry['data'] . PHP_EOL;
}
Kontinuierliches Lesen von Log-Einträgen in einer Schleife
<?php
$log = new VarnishLog([
'host' => '/var/lib/varnish/myhostname/_.vsm',
'timeout' => 500,
]);
$maxIterations = 100;
$count = 0;
while ($count < $maxIterations) {
$entry = $log->getLine();
if ($entry === false) {
// Kein Eintrag verfügbar – kurz warten
usleep(10000);
continue;
}
// Nur Cache-Miss-Ereignisse ausgeben
if ($entry['tag'] === 'HitMiss') {
printf("[%d] HitMiss: %s\n", $entry['vxid'], $entry['data']);
}
$count++;
}
// Wichtig · Fallstricke
Berechtigungen: Der PHP-Prozess muss Lesezugriff auf das Varnish-Shared-Memory-Segment haben. In produktiven Umgebungen sollte der Webserver-Benutzer der Varnish-Gruppe angehören oder das VSM-Verzeichnis entsprechend berechtigt sein.
PECL-Abhängigkeit: VarnishLog ist kein Bestandteil von PHP selbst, sondern der PECL-Erweiterung varnish. Die Verfügbarkeit und exakte API können je nach installierter Version variieren. Die Erweiterung muss explizit über pecl install varnish installiert und in der php.ini aktiviert werden.
Blocking-Verhalten: getLine() kann blockieren oder false zurückgeben, wenn keine neuen Log-Einträge vorhanden sind. In Produktionsumgebungen empfiehlt sich ein explizites Timeout und eine nicht-blockierende Schleife, um den PHP-Prozess nicht dauerhaft zu blockieren.