Start · Sprachen · PHP · Referenz · SysvSharedMemory

SysvSharedMemory

Klasse

Repräsentiert ein System-V-Shared-Memory-Segment und ermöglicht den prozessübergreifenden Datenaustausch über gemeinsamen Speicher.

seit PHP 8.0.0 Kategorie: misc

Signatur

class SysvSharedMemory

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);
array(2) { ["status"]=> string(6) "bereit" ["zähler"]=> int(0) } bereit

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;
}
Shared-Memory-Objekt erfolgreich erstellt. Hallo Shared Memory

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