Signatur
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
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();
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();
// 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.