Signatur
Beschreibung
shm_detach() beendet die Anbindung des aktuellen Prozesses an ein gemeinsames Speichersegment, das zuvor mit shm_attach() erstellt oder geöffnet wurde. Nach dem Aufruf kann der Prozess nicht mehr auf die im Segment gespeicherten Daten zugreifen.
Wichtig: shm_detach() entfernt das Segment nicht aus dem System. Das Segment bleibt bestehen und kann von anderen Prozessen weiter genutzt werden. Um das Segment dauerhaft zu löschen, muss shm_remove() aufgerufen werden.
Die Funktion ist besonders nützlich, um Ressourcen in lang laufenden Prozessen oder nach dem Ende eines kritischen Bereichs sauber freizugeben, ohne andere Prozesse, die dasselbe Segment nutzen, zu beeinträchtigen. Sie gehört zur Gruppe der POSIX-kompatiblen Shared-Memory-Funktionen in PHP.
Unter Windows werden diese Funktionen nicht unterstützt. Für plattformübergreifende Anwendungen sollten alternative Mechanismen (z. B. APCu oder Memcached) in Betracht gezogen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $shm Pflicht | SysvSharedMemory | Das Shared-Memory-Objekt, das von shm_attach() zurückgegeben wurde und von dem sich der aktuelle Prozess trennen soll. |
Rückgabewert
true zurück, wenn die Trennung erfolgreich war. Gibt false zurück, wenn ein Fehler auftritt, z. B. wenn das übergebene Objekt kein gültiges Shared-Memory-Segment repräsentiert.Beispiele
Shared Memory anbinden und wieder trennen
<?php
// Schlüssel für das Shared-Memory-Segment
$key = ftok(__FILE__, 'a');
// Segment erstellen oder öffnen (1 MB groß)
$shm = shm_attach($key, 1024 * 1024, 0666);
if ($shm === false) {
die('Shared-Memory-Segment konnte nicht geöffnet werden.');
}
// Daten ins Segment schreiben
shm_put_var($shm, 1, ['status' => 'aktiv', 'wert' => 42]);
// Daten lesen
$daten = shm_get_var($shm, 1);
var_dump($daten);
// Verbindung trennen (Segment bleibt erhalten)
shm_detach($shm);
echo 'Erfolgreich vom Shared-Memory-Segment getrennt.' . PHP_EOL;
Segment nach Nutzung vollständig aufräumen
<?php
$key = ftok(__FILE__, 'b');
$shm = shm_attach($key, 512, 0600);
shm_put_var($shm, 42, 'Temporäre Daten');
// Erst trennen, dann das Segment entfernen
shm_detach($shm);
// Segment erneut öffnen, um es zu löschen
$shm2 = shm_attach($key, 512, 0600);
shm_remove($shm2);
echo 'Shared-Memory-Segment wurde getrennt und entfernt.' . PHP_EOL;
// Wichtig · Fallstricke
Plattformverfügbarkeit: shm_detach() und die zugehörigen Shared-Memory-Funktionen sind nur auf Unix-ähnlichen Betriebssystemen verfügbar (Linux, macOS). Unter Windows stehen sie nicht zur Verfügung.
Ressourcenverwaltung: Es empfiehlt sich, shm_detach() immer aufzurufen, wenn das Segment nicht mehr benötigt wird, auch wenn PHP am Prozessende eine automatische Bereinigung durchführt. So wird sichergestellt, dass keine unbeabsichtigten Zugriffe mehr stattfinden.
Segment bleibt bestehen: Das Trennen entfernt das Segment nicht. Vergessene Segmente belegen dauerhaft Systemspeicher. Mit ipcs -m können auf der Kommandozeile alle vorhandenen Shared-Memory-Segmente angezeigt werden. Zum Entfernen dient shm_remove() bzw. ipcrm.