Signatur
Beschreibung
shmop_close() beendet den Zugriff auf einen gemeinsamen Speicherbereich, der zuvor mit shmop_open() geöffnet wurde. Die Funktion gibt das interne Handle frei, löscht den Speicherbereich selbst jedoch nicht – dazu muss explizit shmop_delete() aufgerufen werden.
Gemeinsamer Speicher (Shared Memory) erlaubt mehreren Prozessen, Daten ohne Netzwerkkommunikation auszutauschen. shmop_close() entspricht dabei dem Schließen einer Datei: Es trennt den Prozess vom Segment, ohne die Daten darin zu vernichten.
Ab PHP 8.0 erwartet die Funktion ein Shmop-Objekt anstelle einer Ressource. Der Rückgabewert wurde von void (zuvor undokumentiert true) auf explizit void normiert. In älteren PHP-Versionen (vor 8.0) war der Parameter vom Typ resource.
Es empfiehlt sich, shmop_close() am Ende jedes Zugriffszyklus aufzurufen, um Ressourcenlecks zu vermeiden, insbesondere in lang laufenden Prozessen oder Skripten, die viele Segmente öffnen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $shmop Pflicht | Shmop | Ein Shmop-Objekt, das von shmop_open() zurückgegeben wurde. In PHP < 8.0 war dies eine resource. |
Rückgabewert
Beispiele
Gemeinsamen Speicher öffnen, lesen und schließen
<?php
// Gemeinsamen Speicherbereich mit Schlüssel 0x1234 öffnen (oder erstellen)
$shmop = shmop_open(0x1234, 'c', 0644, 128);
if ($shmop === false) {
die('Fehler beim Öffnen des gemeinsamen Speichers.');
}
// Daten in den Speicher schreiben
shmop_write($shmop, 'Hallo Welt', 0);
// Daten aus dem Speicher lesen
$daten = shmop_read($shmop, 0, 10);
echo $daten . PHP_EOL;
// Zugriff schließen (Segment bleibt erhalten)
shmop_close($shmop);
Segment schließen und anschließend löschen
<?php
$key = ftok('/tmp/mein_segment', 'A');
$shmop = shmop_open($key, 'c', 0644, 256);
if ($shmop === false) {
die('Konnte Shared-Memory-Segment nicht öffnen.');
}
shmop_write($shmop, 'Temporäre Daten', 0);
// Segment zum Löschen markieren
shmop_delete($shmop);
// Zugriff schließen — das Segment wird jetzt endgültig entfernt
shmop_close($shmop);
echo 'Segment erfolgreich gelöscht.' . PHP_EOL;
// Wichtig · Fallstricke
Achtung: shmop_close() löscht den gemeinsamen Speicherbereich nicht. Wird shmop_delete() vergessen, bleibt das Segment im System erhalten, bis es manuell mit ipcrm oder einem Neustart bereinigt wird. Dies kann auf Unix-Systemen zu einem Erschöpfen der verfügbaren Shared-Memory-Segmente führen.
Ab PHP 8.0 wurde der frühere Ressource-Typ durch die dedizierte Klasse Shmop ersetzt. Code, der explizit auf den Typ resource prüft, muss für PHP 8.0+ angepasst werden.
Die Shmop-Erweiterung muss beim Build mit --enable-shmop aktiviert sein und steht unter Windows möglicherweise nicht zur Verfügung.