Signatur
Beschreibung
SysvSharedMemory ist eine opake Klasse, die ein System-V-Shared-Memory-Segment kapselt. Instanzen dieser Klasse werden nicht direkt über new erstellt, sondern ausschließlich durch die Funktion shm_attach() zurückgegeben. Sie löst ab PHP 8.0 den bisherigen Ressource-Typ für Shared-Memory-Segmente ab.
System-V-Shared-Memory erlaubt mehreren Prozessen, auf denselben Speicherbereich zuzugreifen – ein typisches Einsatzszenario sind Inter-Prozess-Kommunikation (IPC), Caching von Daten zwischen PHP-CLI-Prozessen oder die gemeinsame Nutzung von Konfigurationsdaten in Worker-Szenarien. Im Gegensatz zu Dateien oder Sockets ist der Zugriff auf Shared Memory extrem schnell, da kein Kernel-I/O stattfindet.
Das Objekt wird mit shm_attach() erstellt bzw. an ein vorhandenes Segment angehängt und mit shm_detach() wieder losgelöst. Zum endgültigen Löschen eines Segments dient shm_remove(). Variablen können über shm_put_var(), shm_get_var() und shm_remove_var() verwaltet werden.
Hinweis: System-V-Shared-Memory steht nur auf Unix-ähnlichen Systemen zur Verfügung (Linux, macOS). Windows-Systeme unterstützen diese API nicht. Die Verfügbarkeit hängt außerdem davon ab, dass PHP mit --enable-sysvshm kompiliert wurde.
Beispiele
Daten zwischen zwei Prozessen über Shared Memory austauschen
<?php
// Shared-Memory-Segment mit Schlüssel 1234 und 10 KB Größe anlegen/öffnen
$shm = shm_attach(1234, 10240, 0666);
if ($shm === false) {
die('Fehler beim Anlegen des Shared-Memory-Segments');
}
// Variable mit ID 1 im Segment speichern
shm_put_var($shm, 1, ['status' => 'bereit', 'zähler' => 0]);
// Variable auslesen
$data = shm_get_var($shm, 1);
var_dump($data);
// Segment abtrennen (nicht löschen)
shm_detach($shm);
// --- In einem anderen Prozess: ---
$shm2 = shm_attach(1234); // selber Schlüssel => selbes Segment
$data2 = shm_get_var($shm2, 1);
echo $data2['status'] . PHP_EOL; // bereit
// Segment dauerhaft entfernen
shm_remove($shm2);
Typ-Prüfung auf SysvSharedMemory-Objekt
<?php
$shm = shm_attach(5678, 4096, 0600);
if ($shm instanceof SysvSharedMemory) {
echo 'Shared-Memory-Objekt erfolgreich erstellt.' . PHP_EOL;
shm_put_var($shm, 42, 'Hallo Shared Memory');
echo shm_get_var($shm, 42) . PHP_EOL;
shm_remove($shm);
} else {
echo 'Fehler beim Erstellen des Segments.' . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformabhängigkeit: System-V-IPC ist ausschließlich auf POSIX-kompatiblen Systemen verfügbar. Unter Windows steht SysvSharedMemory nicht zur Verfügung.
Ressourcen-Limits: Das Betriebssystem begrenzt Anzahl und Gesamtgröße aller Shared-Memory-Segmente (z. B. via SHMMAX/SHMMNI unter Linux). Zu großzügige Segmente oder vergessenes shm_remove() können Systemressourcen erschöpfen – Segmente bleiben nach dem Prozessende erhalten und müssen explizit entfernt werden (z. B. mit ipcrm oder shm_remove()).
Nebenläufigkeit: Shared Memory bietet keinerlei eingebaute Synchronisation. Bei konkurrierendem Zugriff mehrerer Prozesse sollte SysvSemaphore (System-V-Semaphore) zur Absicherung kritischer Abschnitte eingesetzt werden.
Sicherheit: Wählen Sie den IPC-Schlüssel (erstes Argument von shm_attach()) sorgfältig und setzen Sie restriktive Berechtigungen (z. B. 0600), um unberechtigten Zugriff anderer Prozesse zu verhindern.