Start · Sprachen · PHP · Referenz · shm_get_var

shm_get_var

Funktion

Liest eine Variable aus einem Shared-Memory-Segment anhand ihres Schlüssels und gibt sie zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

shm_get_var(SysvSharedMemory $shm, int $key): mixed

Beschreibung

shm_get_var() ermöglicht den Zugriff auf eine zuvor mit shm_put_var() gespeicherte PHP-Variable aus einem gemeinsamen Speicherbereich (Shared Memory). Shared Memory wird typischerweise genutzt, um Daten effizient zwischen mehreren Prozessen auszutauschen, ohne Dateisystem-I/O oder Netzwerkkommunikation zu benötigen.

Die Funktion deserialisiert den gespeicherten Wert automatisch, sodass beliebige PHP-Datentypen – inklusive Arrays und Objekte – übertragen werden können. Der $key-Parameter entspricht dabei dem Schlüssel, der beim Schreiben mit shm_put_var() angegeben wurde.

Typische Einsatzszenarien sind Caching-Mechanismen für kurzlebige Daten, Inter-Prozess-Kommunikation (IPC) in PHP-CLI-Skripten sowie die gemeinsame Nutzung von Konfigurationsdaten zwischen Webserver-Worker-Prozessen. Zu beachten ist, dass Shared Memory systemweit gültig ist und eine sorgfältige Koordination (z. B. per Semaphor) erfordert, wenn mehrere Prozesse gleichzeitig schreiben und lesen.

Die Funktion steht nur auf Unix-artigen Betriebssystemen zur Verfügung und setzt voraus, dass PHP mit der Sysvshm-Erweiterung kompiliert wurde.

Parameter

Name Typ Default Beschreibung
$shm Pflicht SysvSharedMemory Ein Shared-Memory-Handle, das zuvor mit shm_attach() erzeugt wurde.
$key Pflicht int Der ganzzahlige Schlüssel der gewünschten Variable, der beim Speichern mit shm_put_var() verwendet wurde.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den deserialisierten Wert der gespeicherten Variable zurück. Ist unter dem angegebenen $key keine Variable vorhanden, wird ein E_WARNING-Fehler ausgelöst und false zurückgegeben.

Beispiele

Einfaches Schreiben und Lesen aus dem Shared Memory

<?php
// Shared-Memory-Segment erstellen (Schlüssel, Größe in Bytes, Zugriffsrechte)
$shm = shm_attach(1234, 1024, 0600);

// Variable unter Schlüssel 1 speichern
shm_put_var($shm, 1, ['user' => 'Alice', 'role' => 'admin']);

// Variable aus Shared Memory lesen
$data = shm_get_var($shm, 1);

print_r($data);

// Segment wieder freigeben
shm_detach($shm);
Array ( [user] => Alice [role] => admin )

Shared Memory als einfacher Prozess-übergreifender Cache

<?php
$shmKey = ftok(__FILE__, 'c'); // Systemweit eindeutigen Schlüssel erzeugen
$shm    = shm_attach($shmKey, 4096, 0600);

// Daten nur schreiben, wenn noch nicht vorhanden
if (!shm_has_var($shm, 42)) {
    $config = [
        'db_host' => 'localhost',
        'db_port' => 3306,
        'debug'   => false,
    ];
    shm_put_var($shm, 42, $config);
    echo "Konfiguration in Shared Memory geschrieben.\n";
} else {
    $config = shm_get_var($shm, 42);
    echo "Konfiguration aus Shared Memory gelesen:\n";
    print_r($config);
}

shm_detach($shm);
Konfiguration in Shared Memory geschrieben.

// Wichtig · Fallstricke

Plattformunterstützung: Shared Memory via Sysvshm steht nur auf Unix/Linux-Systemen zur Verfügung. Unter Windows ist diese Funktion nicht verfügbar.

Race Conditions: Wenn mehrere Prozesse gleichzeitig auf denselben Schlüssel zugreifen, können inkonsistente Zustände entstehen. Sichern Sie kritische Abschnitte mit sem_acquire() / sem_release() (Semaphore).

Fehlender Schlüssel: Existiert der angegebene $key nicht, wird ein E_WARNING generiert. Prüfen Sie daher mit shm_has_var(), ob der Schlüssel vorhanden ist, bevor Sie lesen.

Speichergröße: Die beim shm_attach()-Aufruf angegebene Größe muss groß genug für alle gespeicherten Variablen (inkl. Serialisierungs-Overhead) sein, sonst schlägt shm_put_var() fehl.