Signatur
Beschreibung
shm_remove() löscht ein zuvor mit shm_open() oder shm_attach() erstelltes Shared-Memory-Segment dauerhaft aus dem Betriebssystem. Anders als shm_detach(), das nur die Verbindung des aktuellen Prozesses trennt, wird das Segment nach shm_remove() systemweit freigegeben und ist für alle weiteren Prozesse nicht mehr erreichbar.
Die Funktion ist ausschließlich auf UNIX-ähnlichen Systemen (Linux, macOS, BSD etc.) verfügbar und steht unter Windows nicht zur Verfügung. Sie eignet sich typischerweise am Ende eines Programms oder bei der Bereinigung von Ressourcen, um Speicherlecks auf Betriebssystem-Ebene zu vermeiden, da Shared-Memory-Segmente auch nach dem Ende des PHP-Prozesses bestehen bleiben können.
Ein typischer Workflow umfasst: Segment mit shm_attach() erstellen, Daten lesen und schreiben, und abschließend zuerst shm_detach() und dann shm_remove() aufrufen, um Ressourcen ordnungsgemäß freizugeben. Es ist ratsam, das Entfernen nur im Hauptprozess oder in einem dedizierten Cleanup-Handler vorzunehmen, um Race Conditions zu vermeiden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $shm Pflicht | SysvSharedMemory | Das Shared-Memory-Handle, das von shm_attach() zurückgegeben wurde und das zu entfernende Segment identifiziert. |
Rückgabewert
true zurück, wenn das Segment erfolgreich entfernt wurde, andernfalls false.Beispiele
Shared-Memory-Segment erstellen, nutzen und entfernen
<?php
// Segment erstellen: Key, Größe in Bytes, Rechte
$shm = shm_attach(1234, 1024, 0600);
if ($shm === false) {
die('Shared Memory konnte nicht erstellt werden.');
}
// Einen Wert unter Variablen-ID 1 speichern
shm_put_var($shm, 1, 'Hallo, Shared Memory!');
// Wert lesen
$wert = shm_get_var($shm, 1);
echo $wert . PHP_EOL;
// Verbindung trennen
shm_detach($shm);
// Segment vollständig aus dem System entfernen
$ergebnis = shm_remove($shm);
echo $ergebnis ? 'Segment entfernt.' : 'Fehler beim Entfernen.';
Cleanup-Funktion mit register_shutdown_function
<?php
$key = ftok(__FILE__, 'p');
$shm = shm_attach($key, 2048, 0600);
if ($shm === false) {
die('Shared Memory konnte nicht erstellt werden.');
}
// Automatische Bereinigung beim Skript-Ende registrieren
register_shutdown_function(function () use ($shm) {
shm_detach($shm);
shm_remove($shm);
echo 'Cleanup abgeschlossen.' . PHP_EOL;
});
shm_put_var($shm, 42, ['status' => 'aktiv', 'count' => 7]);
$daten = shm_get_var($shm, 42);
print_r($daten);
// Wichtig · Fallstricke
Persistenz: Shared-Memory-Segmente werden vom Betriebssystem verwaltet und überleben das Ende des PHP-Prozesses. Wird shm_remove() nicht aufgerufen, bleibt das Segment im System aktiv. Mit dem Shell-Befehl ipcs -m lassen sich verwaiste Segmente anzeigen und mit ipcrm -m <id> manuell entfernen.
Race Conditions: In einer Umgebung mit mehreren Prozessen, die dasselbe Segment nutzen, sollte shm_remove() erst aufgerufen werden, wenn alle anderen Prozesse das Segment nicht mehr benötigen. Ein Entfernen während ein anderer Prozess noch auf das Segment zugreift, kann zu undefiniertem Verhalten führen.
Plattform: Diese Funktion ist nur auf UNIX-Systemen verfügbar. Unter Windows gibt es kein Äquivalent in dieser Extension; für plattformübergreifende Lösungen sollte auf Alternativen wie APCu oder Redis ausgewichen werden.