Start · Sprachen · PHP · Referenz · shmop_delete

shmop_delete

Funktion

Markiert einen gemeinsamen Speicherbereich (<em>Shared Memory</em>) zur Löschung, sodass er vom Betriebssystem freigegeben wird.

seit PHP 4.0.1 Kategorie: misc

Signatur

shmop_delete(Shmop $shmop): bool

Beschreibung

shmop_delete() markiert einen zuvor mit shmop_open() erzeugten gemeinsamen Speicherblock zur Löschung. Unter Unix/Linux entspricht dies dem Aufruf von shmctl(IPC_RMID): Der Block wird sofort für neue Verbindungen gesperrt, jedoch erst dann physisch freigegeben, wenn alle Prozesse ihre Verbindung dazu geschlossen haben.

Die Funktion setzt lediglich das Lösch-Flag; um den Speicher auch innerhalb des aktuellen Prozesses zu schließen und den zugehörigen Ressource-Handle freizugeben, muss anschließend shmop_close() aufgerufen werden. In PHP 8.0+ ist der Rückgabewert von shmop_open() ein Shmop-Objekt statt einer Ressource, das automatisch beim Garbage-Collect geschlossen wird – der explizite Aufruf von shmop_close() bleibt jedoch guter Stil.

Typische Anwendungsfälle sind IPC-Szenarien (Inter-Process Communication), bei denen mehrere PHP-Prozesse oder -Skripte über gemeinsamen Speicher kommunizieren und nach Beendigung der Arbeit den belegten Speicher sauber freigeben müssen, um Ressourcenlecks zu vermeiden.

Parameter

Name Typ Default Beschreibung
$shmop Pflicht Shmop Das Shmop-Objekt (PHP 8.0+) bzw. die Shmop-Ressource (PHP < 8.0), das von shmop_open() zurückgegeben wurde und auf den zu löschenden Shared-Memory-Block verweist.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Lösch-Flag erfolgreich gesetzt werden konnte, andernfalls false. Ein Scheitern tritt typischerweise auf, wenn der Prozess keine ausreichenden Berechtigungen für den Shared-Memory-Block besitzt.

Beispiele

Einfaches Anlegen, Beschreiben und Löschen eines Shared-Memory-Blocks

<?php
// Shared-Memory-Block erstellen (Schlüssel, Modus, Berechtigung, Größe in Bytes)
$shm = shmop_open(0x1234, 'c', 0644, 64);

if ($shm === false) {
    die('Shared Memory konnte nicht geöffnet werden.');
}

// Daten in den Block schreiben
$written = shmop_write($shm, 'Hallo Welt!', 0);
echo "Geschriebene Bytes: $written\n";

// Daten lesen
$data = shmop_read($shm, 0, 11);
echo "Gelesene Daten: $data\n";

// Block zur Löschung markieren
if (shmop_delete($shm)) {
    echo "Shared-Memory-Block erfolgreich zum Löschen markiert.\n";
} else {
    echo "Fehler beim Löschen des Shared-Memory-Blocks.\n";
}

// Verbindung zum Block schließen
shmop_close($shm);
Geschriebene Bytes: 11 Gelesene Daten: Hallo Welt! Shared-Memory-Block erfolgreich zum Löschen markiert.

Fehlerbehandlung beim Löschen mit unterschiedlichen Prozessen

<?php
$key = ftok(__FILE__, 'p'); // Eindeutigen Schlüssel aus Dateipfad erzeugen

$shm = shmop_open($key, 'c', 0600, 128);
if ($shm === false) {
    die('Konnte Shared Memory nicht anlegen.');
}

shmop_write($shm, str_pad('Payload', 128, "\0"), 0);

// Aufräumen: erst löschen, dann schließen
if (!shmop_delete($shm)) {
    error_log('Warnung: Shared-Memory-Block konnte nicht gelöscht werden (Key: ' . $key . ')');
}

shmop_close($shm);
echo "Bereinigung abgeschlossen.\n";
Bereinigung abgeschlossen.

// Wichtig · Fallstricke

Reihenfolge beachten: Rufe immer zuerst shmop_delete() und danach shmop_close() auf. Wird nur shmop_close() verwendet, bleibt der Shared-Memory-Block im System erhalten und belegt Ressourcen, bis das Betriebssystem ihn selbst freigibt (z. B. beim Neustart).

Plattformabhängigkeit: Shared Memory via shmop setzt eine POSIX-kompatible Umgebung voraus. Unter Windows ist die Unterstützung eingeschränkt und kann zu unerwartetem Verhalten führen.

Berechtigungen: Nur der Eigentümer des Shared-Memory-Blocks oder ein Prozess mit Root-Rechten kann den Block löschen. Andernfalls gibt shmop_delete() false zurück.

PHP 8.0: Der Typ des Parameters hat sich von resource zu Shmop geändert. Bestehender Code, der den Typ explizit prüft (z. B. is_resource()), muss entsprechend angepasst werden.