Signatur
Beschreibung
shmop_open() ermöglicht den Zugriff auf Shared-Memory-Segmente des Betriebssystems (System V IPC). Damit können mehrere PHP-Prozesse oder -Skripte effizient Daten austauschen, ohne auf Dateien oder Datenbanken angewiesen zu sein. Dies ist besonders nützlich für hochfrequenten interprozesskommunikativen Datenaustausch, z. B. bei Worker-Prozessen oder Caching-Lösungen auf einzelnen Servern.
Der Parameter $key identifiziert das Speichersegment systemweit eindeutig (ein Integer-Schlüssel, oft via ftok() erzeugt). Über $flags wird gesteuert, ob das Segment neu erstellt, exklusiv erstellt, geöffnet oder geöffnet/erstellt werden soll. $mode gibt die Zugriffsrechte (ähnlich Unix-Dateiberechtigungen, z. B. 0644) an, und $size legt die Größe in Bytes fest.
Ab PHP 8.0 gibt die Funktion ein Shmop-Objekt zurück (früher war es eine Ressource). Das Objekt wird für alle weiteren shmop_*-Funktionen benötigt. Bei Fehlern, z. B. wenn ein exklusiv zu erstellendes Segment bereits existiert, wird false zurückgegeben.
Shared Memory ist flüchtig und wird beim Neustart des Systems geleert. Es ist wichtig, Segmente nach der Verwendung mit shmop_close() zu schließen und bei Bedarf mit shmop_delete() zu entfernen, um Ressourcenlecks zu vermeiden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | int | Systemweiter Integer-Schlüssel für das Shared-Memory-Segment. Kann z. B. mit ftok() aus einem Dateipfad erzeugt werden. |
|
| $flags Pflicht | string | Steuert den Zugriffsmodus:
|
|
| $mode Pflicht | int | Unix-Zugriffsrechte für das Segment als Oktalzahl, z. B. 0644. Wird beim Öffnen ('a', 'w') ignoriert. |
|
| $size Pflicht | int | Größe des Shared-Memory-Segments in Bytes. Beim reinen Öffnen ('a', 'w') kann 0 übergeben werden. |
Rückgabewert
Shmop-Objekt zurück (vor PHP 8.0 eine Ressource), das für weitere shmop_*-Funktionen benötigt wird. Bei einem Fehler (z. B. Segment existiert bereits bei Flag 'n', oder fehlende Berechtigungen) wird false zurückgegeben.Beispiele
Shared-Memory-Segment erstellen und beschreiben
<?php
// Schlüssel aus Dateipfad und Projekt-ID erzeugen
$key = ftok(__FILE__, 'A');
// Segment erstellen oder öffnen, 128 Bytes, Rechte 0644
$shm = shmop_open($key, 'c', 0644, 128);
if ($shm === false) {
die('Shared Memory konnte nicht erstellt werden.');
}
// Daten in den Speicher schreiben
$message = 'Hallo Shared Memory!';
$written = shmop_write($shm, $message, 0);
echo "Geschriebene Bytes: $written\n";
// Segment schließen (nicht löschen)
shmop_close($shm);
?>
Daten aus einem bestehenden Segment lesen
<?php
$key = ftok(__FILE__, 'A');
// Bestehendes Segment öffnen (nur lesen/schreiben, kein Create)
$shm = shmop_open($key, 'w', 0, 0);
if ($shm === false) {
die('Shared Memory konnte nicht geöffnet werden.');
}
// 20 Bytes ab Offset 0 lesen
$data = shmop_read($shm, 0, 20);
echo "Gelesene Daten: $data\n";
shmop_close($shm);
// Segment vom System entfernen
$shm2 = shmop_open($key, 'w', 0, 0);
if ($shm2 !== false) {
shmop_delete($shm2);
shmop_close($shm2);
}
?>
// Wichtig · Fallstricke
Plattformabhängigkeit: shmop_open() basiert auf System V Shared Memory (IPC) und steht daher primär auf Unix/Linux-Systemen zur Verfügung. Unter Windows ist die Unterstützung eingeschränkt und kann fehlen.
Ressourcenlecks: Nicht gelöschte Shared-Memory-Segmente bleiben systemweit bestehen, bis der Server neu gestartet wird. Prüfe mit ipcs -m auf der Kommandozeile, ob verwaiste Segmente vorhanden sind, und entferne sie ggf. mit ipcrm -m oder shmop_delete().
Datenkonsistenz: Bei gleichzeitigem Zugriff mehrerer Prozesse sind keine Locking-Mechanismen eingebaut. Für atomare Operationen sollte zusätzlich sem_acquire() (Semaphore) verwendet werden.
PHP 8.0: Ab PHP 8.0 wird ein Shmop-Objekt statt einer Ressource zurückgegeben. Code, der auf is_resource() prüft, muss angepasst werden.