Start · Sprachen · PHP · Referenz · inotify_rm_watch

inotify_rm_watch

Funktion

Entfernt eine bestehende Überwachung (Watch) aus einer Inotify-Instanz anhand des Watch-Deskriptors.

seit PHP 0.1.0 Kategorie: io

Signatur

inotify_rm_watch(resource $inotify_instance, int $watch_descriptor): bool

Beschreibung

inotify_rm_watch() entfernt einen zuvor mit inotify_add_watch() registrierten Watch-Deskriptor aus der angegebenen Inotify-Instanz. Damit wird die Überwachung der entsprechenden Datei oder des Verzeichnisses beendet. Die Funktion ist Teil der PECL-Erweiterung inotify, die das Linux-Kernel-Subsystem inotify für PHP zugänglich macht.

Sobald ein Watch entfernt wurde, erzeugt das Kernel-Subsystem automatisch ein IN_IGNORED-Ereignis für diesen Watch-Deskriptor. Dieses Ereignis kann beim nächsten Aufruf von inotify_read() ausgelesen werden und signalisiert, dass der Watch nicht mehr aktiv ist.

Das Entfernen von Watches ist wichtig, um Ressourcen freizugeben. Jede Inotify-Instanz hat eine systemweite Begrenzung der maximalen Anzahl aktiver Watches (konfigurierbar über /proc/sys/fs/inotify/max_user_watches). Nicht mehr benötigte Watches sollten daher zeitnah entfernt werden.

Die Funktion ist ausschließlich auf Linux-Systemen verfügbar und erfordert PHP mit der installierten und aktivierten PECL-Erweiterung inotify.

Parameter

Name Typ Default Beschreibung
$inotify_instance Pflicht resource Eine Inotify-Instanz, die zuvor mit inotify_init() erstellt wurde.
$watch_descriptor Pflicht int Der Watch-Deskriptor, der entfernt werden soll. Er wurde beim Aufruf von inotify_add_watch() zurückgegeben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Watch erfolgreich entfernt wurde, andernfalls false.

Beispiele

Verzeichnisüberwachung starten und wieder beenden

<?php
// Inotify-Instanz erstellen
$inotify = inotify_init();

// Verzeichnis auf neue Dateien überwachen
$watchDescriptor = inotify_add_watch($inotify, '/tmp', IN_CREATE | IN_DELETE);

echo "Überwachung gestartet. Watch-Deskriptor: $watchDescriptor\n";

// Ereignisse auslesen (nicht-blockierend via stream_select)
$read = [$inotify];
$write = $except = [];
if (stream_select($read, $write, $except, 2)) {
    $events = inotify_read($inotify);
    foreach ($events as $event) {
        echo "Ereignis: Maske={$event['mask']}, Name={$event['name']}\n";
    }
}

// Watch entfernen, wenn nicht mehr benötigt
if (inotify_rm_watch($inotify, $watchDescriptor)) {
    echo "Watch erfolgreich entfernt.\n";
}

// IN_IGNORED-Ereignis lesen, das nach dem Entfernen generiert wird
$events = inotify_read($inotify);
foreach ($events as $event) {
    if ($event['mask'] & IN_IGNORED) {
        echo "IN_IGNORED-Ereignis empfangen — Watch ist inaktiv.\n";
    }
}

// Ressource schließen
fclose($inotify);
Überwachung gestartet. Watch-Deskriptor: 1 Watch erfolgreich entfernt. IN_IGNORED-Ereignis empfangen — Watch ist inaktiv.

Mehrere Watches verwalten und gezielt entfernen

<?php
$inotify = inotify_init();

$dirs = ['/tmp', '/var/log'];
$watches = [];

// Mehrere Verzeichnisse überwachen
foreach ($dirs as $dir) {
    $wd = inotify_add_watch($inotify, $dir, IN_CREATE | IN_MODIFY);
    $watches[$dir] = $wd;
    echo "Überwache '$dir' mit Watch-Deskriptor $wd\n";
}

// Nur /var/log aus der Überwachung entfernen
$dirToRemove = '/var/log';
if (isset($watches[$dirToRemove])) {
    inotify_rm_watch($inotify, $watches[$dirToRemove]);
    unset($watches[$dirToRemove]);
    echo "Watch für '$dirToRemove' entfernt.\n";
}

// Alle verbleibenden Watches entfernen
foreach ($watches as $dir => $wd) {
    inotify_rm_watch($inotify, $wd);
    echo "Watch für '$dir' entfernt.\n";
}

fclose($inotify);
Überwache '/tmp' mit Watch-Deskriptor 1 Überwache '/var/log' mit Watch-Deskriptor 2 Watch für '/var/log' entfernt. Watch für '/tmp' entfernt.

// Wichtig · Fallstricke

Systemlimit: Linux begrenzt die Anzahl der inotify-Watches pro Benutzer. Das Limit ist in /proc/sys/fs/inotify/max_user_watches einsehbar und beträgt standardmäßig 8192. Wird dieses Limit erreicht, schlägt inotify_add_watch() fehl. Nicht mehr benötigte Watches sollten daher immer mit inotify_rm_watch() entfernt werden.

IN_IGNORED-Ereignis: Nach dem Entfernen eines Watches generiert der Kernel automatisch ein IN_IGNORED-Ereignis. Dieses sollte im Event-Loop entsprechend behandelt werden, um Verwirrung mit regulären Ereignissen zu vermeiden.

Plattformbeschränkung: Die gesamte inotify-Erweiterung ist ausschließlich auf Linux verfügbar. Auf anderen Betriebssystemen (macOS, Windows) steht diese Funktion nicht zur Verfügung.