Start · Sprachen · PHP · Referenz · sem_remove

sem_remove

Funktion

Entfernt einen zuvor erstellten System-V-Semaphor dauerhaft aus dem System.

seit PHP 4.0.0 Kategorie: misc

Signatur

sem_remove(SysvSemaphore $semaphore): bool

Beschreibung

sem_remove() löscht einen System-V-Semaphor, der zuvor mit sem_get() erstellt wurde, vollständig aus dem Betriebssystem. Nach dem Aufruf ist der Semaphor nicht mehr verwendbar, und alle Prozesse, die auf ihn warten oder ihn halten, erhalten eine Fehlermeldung.

Diese Funktion sollte aufgerufen werden, wenn ein Semaphor nicht mehr benötigt wird – typischerweise am Ende eines Prozesses oder einer Anwendung, die Interprozesskommunikation (IPC) nutzt. Ohne explizites Entfernen verbleibt der Semaphor im Betriebssystem-IPC-Speicher, auch nachdem alle PHP-Prozesse beendet wurden, was zu Ressourcenlecks führen kann.

Auf Unix/Linux-Systemen lassen sich vorhandene Semaphoren mit dem Befehl ipcs -s auflisten und mit ipcrm -s <semid> manuell entfernen. sem_remove() erledigt das programmatisch direkt aus PHP.

Zu beachten ist, dass nach dem Entfernen des Semaphors alle weiteren Aufrufe von sem_acquire() oder sem_release() auf demselben Handle fehlschlagen. Der Semaphor sollte daher erst entfernt werden, wenn keine weiteren Zugriffe mehr stattfinden.

Parameter

Name Typ Default Beschreibung
$semaphore Pflicht SysvSemaphore Das Semaphor-Objekt, das zuvor mit sem_get() erstellt wurde und nun aus dem System entfernt werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Semaphor erfolgreich entfernt wurde, andernfalls false. Im Fehlerfall wird zusätzlich eine Warnung ausgegeben.

Beispiele

Semaphor erstellen, verwenden und entfernen

<?php
// Semaphor mit eindeutigem Schlüssel erstellen
$key = ftok(__FILE__, 'a');
$semaphore = sem_get($key, 1);

if ($semaphore === false) {
    die('Semaphor konnte nicht erstellt werden.');
}

// Kritischen Abschnitt sperren
if (sem_acquire($semaphore)) {
    echo "Semaphor erworben – kritischer Abschnitt läuft..." . PHP_EOL;

    // Kritische Operation (z. B. Datei schreiben, DB-Zugriff)
    sleep(1);

    // Semaphor freigeben
    sem_release($semaphore);
    echo "Semaphor freigegeben." . PHP_EOL;
}

// Semaphor dauerhaft entfernen, wenn er nicht mehr gebraucht wird
if (sem_remove($semaphore)) {
    echo "Semaphor erfolgreich entfernt." . PHP_EOL;
} else {
    echo "Fehler beim Entfernen des Semaphors." . PHP_EOL;
}
?>
Semaphor erworben – kritischer Abschnitt läuft... Semaphor freigegeben. Semaphor erfolgreich entfernt.

Ressourcenbereinigung in einer Anwendung mit mehreren Semaphoren

<?php
$keys = [1001, 1002, 1003];
$semaphores = [];

// Mehrere Semaphoren erstellen
foreach ($keys as $key) {
    $sem = sem_get($key, 1);
    if ($sem !== false) {
        $semaphores[$key] = $sem;
    }
}

echo count($semaphores) . " Semaphoren erstellt." . PHP_EOL;

// Anwendungslogik ...

// Alle Semaphoren am Ende bereinigen
foreach ($semaphores as $key => $sem) {
    if (sem_remove($sem)) {
        echo "Semaphor mit Schlüssel {$key} entfernt." . PHP_EOL;
    }
}
?>
3 Semaphoren erstellt. Semaphor mit Schlüssel 1001 entfernt. Semaphor mit Schlüssel 1002 entfernt. Semaphor mit Schlüssel 1003 entfernt.

// Wichtig · Fallstricke

Achtung: sem_remove() entfernt den Semaphor sofort aus dem System, auch wenn andere Prozesse ihn noch halten oder darauf warten. Dies kann zu unerwartetem Verhalten oder Fehlern in diesen Prozessen führen. Der Aufruf sollte daher nur erfolgen, wenn sicher ist, dass kein anderer Prozess den Semaphor noch benötigt.

Diese Funktion steht nur auf Betriebssystemen zur Verfügung, die System-V-IPC unterstützen (Linux, macOS, BSD). Unter Windows ist sie nicht verfügbar.

Ab PHP 8.0 gibt sem_get() ein SysvSemaphore-Objekt zurück (zuvor eine Ressource). sem_remove() akzeptiert entsprechend beide Typen, je nach PHP-Version.

Nicht entfernte Semaphoren bleiben im IPC-Speicher des Betriebssystems, bis der Server neu gestartet wird. Bei häufigem Erstellen ohne Bereinigung können Systemlimits überschritten werden (prüfbar mit ipcs -s).