Start · Sprachen · PHP · Referenz · inotify_init

inotify_init

Funktion

Initialisiert eine Inotify-Instanz und gibt eine Ressource zurück, mit der Dateisystem-Ereignisse überwacht werden können.

seit PHP 0.1.0 (PECL inotify) Kategorie: io

Signatur

inotify_init(): resource

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg eine Inotify-Ressource (Stream) zurück. Im Fehlerfall wird 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);
Überwache Verzeichnis: /tmp Warte auf Ereignisse ... [Erstellt] Datei: beispiel.txt

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);
Kein Ereignis in diesem Zyklus (0). Ereignis-Maske: 256 | Datei: test.txt Kein Ereignis in diesem Zyklus (2).

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