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