Signatur
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
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);
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";
// 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.