Signatur
Beschreibung
inotify_init() erstellt eine neue Inotify-Instanz auf Linux-Systemen. Inotify ist ein Linux-Kernel-Subsystem, das es ermöglicht, Änderungen im Dateisystem in Echtzeit zu überwachen – zum Beispiel das Erstellen, Löschen, Umbenennen oder Modifizieren von Dateien und Verzeichnissen.
Die zurückgegebene Ressource wird als Dateideskriptor behandelt und kann zusammen mit inotify_add_watch() verwendet werden, um Verzeichnisse oder Dateien zur Überwachungsliste hinzuzufügen. Mit inotify_read() können anschließend aufgetretene Ereignisse ausgelesen werden.
Die Inotify-Ressource verhält sich wie ein normaler Stream und kann daher auch mit den PHP-Stream-Funktionen wie stream_select() kombiniert werden, um nicht-blockierende Überwachungs-Schleifen zu realisieren.
Diese Funktion ist nur unter Linux verfügbar und erfordert die PECL-Erweiterung inotify. Vergessen Sie nicht, die Instanz am Ende mit fclose() zu schließen, um Ressourcen freizugeben.
Rückgabewert
false zurückgegeben, z. B. wenn das System-Limit für Inotify-Instanzen erreicht ist oder die Erweiterung nicht verfügbar ist.Beispiele
Einfaches Überwachen eines Verzeichnisses auf Änderungen
<?php
// Inotify-Instanz initialisieren
$inotify = inotify_init();
if ($inotify === false) {
die('Inotify konnte nicht initialisiert werden.');
}
$watchDir = '/tmp';
// Verzeichnis zur Überwachung hinzufügen (Erstellen und Löschen von Dateien)
$watchDescriptor = inotify_add_watch($inotify, $watchDir, IN_CREATE | IN_DELETE);
echo "Überwache Verzeichnis: $watchDir" . PHP_EOL;
echo "Warte auf Ereignisse ..." . PHP_EOL;
// Ereignisse lesen (blockierend)
$events = inotify_read($inotify);
foreach ($events as $event) {
$type = ($event['mask'] & IN_CREATE) ? 'Erstellt' : 'Gelöscht';
echo "[$type] Datei: " . $event['name'] . PHP_EOL;
}
// Beobachtung beenden und Ressource freigeben
inotify_rm_watch($inotify, $watchDescriptor);
fclose($inotify);
Nicht-blockierende Überwachung mit stream_select()
<?php
$inotify = inotify_init();
// Nicht-blockierenden Modus aktivieren
stream_set_blocking($inotify, false);
$watchDescriptor = inotify_add_watch($inotify, '/tmp', IN_CREATE | IN_MODIFY | IN_DELETE);
// Ereignisschleife (max. 10 Durchläufe zu je 1 Sekunde)
for ($i = 0; $i < 10; $i++) {
$read = [$inotify];
$write = null;
$except = null;
// Auf neue Ereignisse warten (Timeout: 1 Sekunde)
$changed = stream_select($read, $write, $except, 1);
if ($changed > 0) {
$events = inotify_read($inotify);
if ($events !== false) {
foreach ($events as $event) {
echo 'Ereignis-Maske: ' . $event['mask']
. ' | Datei: ' . $event['name'] . PHP_EOL;
}
}
} else {
echo "Kein Ereignis in diesem Zyklus ($i)." . PHP_EOL;
}
}
inotify_rm_watch($inotify, $watchDescriptor);
fclose($inotify);
// Wichtig · Fallstricke
Linux-exklusiv: Inotify ist eine Linux-spezifische Funktion und steht auf macOS, Windows oder BSD-Systemen nicht zur Verfügung. Für plattformübergreifende Dateisystem-Überwachung sollten Alternativen gesucht werden.
Systemgrenzen: Das Linux-System begrenzt die Anzahl der Inotify-Instanzen (/proc/sys/fs/inotify/max_user_instances) und die Anzahl der Watches pro Instanz (/proc/sys/fs/inotify/max_user_watches). Bei Überschreitung schlägt inotify_init() bzw. inotify_add_watch() fehl.
Ressourcen-Verwaltung: Jede mit inotify_init() erstellte Instanz belegt einen Dateideskriptor. Nicht mehr benötigte Instanzen müssen zwingend mit fclose() geschlossen werden, um Ressourcen-Lecks zu vermeiden.
PECL-Erweiterung: Die Funktion ist nicht Bestandteil des PHP-Kerns, sondern wird über die PECL-Erweiterung inotify bereitgestellt. Installation per pecl install inotify und anschließender Aktivierung in der php.ini.