Start · Sprachen · PHP · Referenz · shm_remove

shm_remove

Funktion

Entfernt einen gemeinsamen Speicherbereich (Shared Memory Segment) unter UNIX vollständig aus dem System.

seit PHP 4.0.0 Kategorie: misc

Signatur

shm_remove(SysvSharedMemory $shm): bool

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

Typ
bool
Beschreibung
Gibt 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.';
Hallo, Shared Memory! Segment entfernt.

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);
Array ( [status] => aktiv [count] => 7 ) Cleanup abgeschlossen.

// 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.