Start · Sprachen · PHP · Referenz · EvStat

EvStat

Klasse

Überwacht Änderungen an einer Datei oder einem Pfad mittels <code>stat()</code> und löst einen Callback aus, wenn sich Attribute wie Größe oder Änderungszeit ändern.

seit PHP 5.4.0 Kategorie: io

Signatur

class EvStat extends EvWatcher

Beschreibung

EvStat ist ein Watcher der PECL-Ev-Extension, der periodisch den Systemaufruf stat() auf einem angegebenen Pfad ausführt und den registrierten Callback aufruft, sobald sich die Metadaten der Datei – z. B. Dateigröße, Änderungszeit (mtime) oder Berechtigungen – verändern. Das ist besonders nützlich, um Konfigurationsdateien, Log-Dateien oder andere Ressourcen zu beobachten, ohne kontinuierlich pollen zu müssen.

Im Gegensatz zu betriebssystemspezifischen Benachrichtigungsmechanismen (wie inotify) ist EvStat plattformübergreifend einsetzbar. Der Watcher prüft das Dateisystem in einem einstellbaren Intervall (interval). Wenn das Intervall auf 0 gesetzt wird, wählt die Ev-Bibliothek selbst ein geeignetes Intervall (in der Regel etwa 5 Sekunden).

Nach dem Auslösen des Callbacks können die vorherigen und aktuellen stat-Daten über die Eigenschaften attr und prev abgerufen werden. Damit lässt sich exakt feststellen, welche Attribute sich geändert haben. Mit der Methode stat() des Watchers kann der aktuelle Zustand manuell abgerufen werden.

EvStat eignet sich gut für langlaufende PHP-Prozesse (z. B. Daemons oder Reaktionssysteme), die auf Dateiänderungen reagieren sollen, ohne blockierende Polling-Schleifen zu verwenden.

Parameter

Name Typ Default Beschreibung
$path Pflicht string Der absolute oder relative Pfad zur zu überwachenden Datei oder zum Verzeichnis. Darf auch auf eine nicht existierende Datei zeigen – der Watcher löst aus, wenn die Datei erstellt oder gelöscht wird.
$interval Pflicht float Prüfintervall in Sekunden. Bei 0.0 wählt die Ev-Bibliothek automatisch ein sinnvolles Intervall (typischerweise ca. 5 Sekunden). Kleinere Werte erhöhen die Reaktionsgeschwindigkeit, aber auch die CPU-Last.
$callback Pflicht callable Eine aufrufbare Funktion oder Methode, die aufgerufen wird, sobald eine Änderung erkannt wurde. Erhält als Parameter den Watcher selbst und ein optionales Ereignis-Flag.
$data mixed null Beliebige benutzerdefinierte Daten, die dem Watcher zugeordnet werden und über die Eigenschaft data im Callback zugänglich sind.
$priority int 0 Priorität des Watchers. Höhere Werte bedeuten höhere Priorität bei der Ausführungsreihenfolge. Gültige Werte: Ev::MINPRI bis Ev::MAXPRI.

Rückgabewert

Typ

Beispiele

Konfigurationsdatei auf Änderungen überwachen

<?php
// Ev-Extension wird vorausgesetzt (pecl install ev)

$configFile = '/etc/myapp/config.json';

$watcher = new EvStat($configFile, 0.0, function (EvStat $w) {
    $prev = $w->prev;
    $curr = $w->attr;

    echo "Änderung erkannt in: {$w->path}" . PHP_EOL;

    if ($curr['nlink'] === 0) {
        echo "Datei wurde gelöscht." . PHP_EOL;
    } elseif ($prev['mtime'] !== $curr['mtime']) {
        echo "Datei wurde geändert. Neue Größe: {$curr['size']} Bytes" . PHP_EOL;
        // Hier Konfiguration neu laden
    }
});

Ev::run();
Änderung erkannt in: /etc/myapp/config.json Datei wurde geändert. Neue Größe: 1024 Bytes

Watcher auf nicht existierende Datei – Erkennung der Erstellung

<?php
// Überwacht eine Datei, die noch nicht existiert.
// Der Callback wird ausgelöst, wenn die Datei erstellt wird.

$lockFile = '/tmp/myapp.lock';

$watcher = new EvStat($lockFile, 1.0, function (EvStat $w) {
    $attr = $w->attr;

    if ($attr['nlink'] > 0) {
        echo "Lock-Datei wurde erstellt. Prozess pausiert." . PHP_EOL;
        $w->stop(); // Watcher nach einmaliger Reaktion stoppen
    }
}, null, Ev::MINPRI);

// Manuell den aktuellen stat-Status abrufen
$watcher->stat();

Ev::run();
Lock-Datei wurde erstellt. Prozess pausiert.

// Wichtig · Fallstricke

Plattformverhalten: Auf Systemen, die inotify oder ähnliche Kernel-Mechanismen unterstützen, kann die Ev-Bibliothek diese intern nutzen. Das Intervall dient dann als Fallback-Polling-Intervall.

Nicht existierende Pfade: EvStat kann auch Pfade überwachen, die noch nicht existieren. Wenn das Feld nlink im attr-Array 0 ist, existiert die Datei nicht. Das Erstellen oder Löschen einer Datei löst ebenfalls den Callback aus.

Ressourcen: Für eine große Anzahl gleichzeitig überwachter Dateien kann EvStat mit kleinen Intervallen die CPU-Last deutlich erhöhen. In solchen Fällen sollte das Intervall angepasst oder ein betriebssystemspezifischer Mechanismus (z. B. inotify über inotify_*-Funktionen) in Betracht gezogen werden.

Abhängigkeit: Die Klasse erfordert die PECL-Ev-Extension, die nicht standardmäßig in PHP enthalten ist.