Start · Sprachen · PHP · Referenz · VarnishLog

VarnishLog

Klasse

Liest Log-Einträge eines Varnish-Cache-Servers aus dem Shared Memory aus.

Kategorie: misc

Signatur

class VarnishLog

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;
}
Tag: ReqURL VXId: 12345 Daten: /index.php

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++;
}
[98231] HitMiss: miss [98244] HitMiss: hit

// 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.