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