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