Start · Sprachen · PHP · Referenz · shmop_close

shmop_close

Funktion

Schließt einen zuvor geöffneten gemeinsamen Speicherbereich (<code>Shmop</code>-Objekt) und gibt die zugehörigen Ressourcen frei.

seit PHP 5.0.0 Kategorie: misc

Signatur

shmop_close(Shmop $shmop): void

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

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

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);
Hallo Welt

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;
Segment erfolgreich gelöscht.

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