Start · Sprachen · PHP · Referenz · shm_put_var

shm_put_var

Funktion

Speichert eine PHP-Variable unter einem Schlüssel in einem gemeinsamen Speicherbereich (Shared Memory), den mehrere Prozesse gemeinsam nutzen können.

seit PHP 4.0.0 Kategorie: misc

Signatur

shm_put_var(SysvSharedMemory $shm, int $key, mixed $value): bool

Beschreibung

shm_put_var() serialisiert eine beliebige PHP-Variable und schreibt sie unter dem angegebenen Ganzzahl-Schlüssel $key in den zuvor mit shm_attach() eröffneten Shared-Memory-Bereich. Existiert unter dem Schlüssel bereits ein Eintrag, wird er überschrieben.

Diese Funktion ist Teil der System V Shared Memory-Erweiterung und ermöglicht es, Daten zwischen verschiedenen PHP-Prozessen (z. B. einem Webserver-Worker und einem CLI-Prozess) schnell im RAM auszutauschen, ohne eine Datenbank oder temporäre Dateien verwenden zu müssen.

Da PHP-Variablen intern serialisiert werden, können nahezu alle Typen gespeichert werden – Arrays, Objekte, Strings, Integer usw. Nicht serialisierbare Werte (z. B. Ressourcen) führen jedoch zu Problemen. Beim Lesen muss der gleiche Schlüssel über shm_get_var() angegeben werden.

Der gemeinsame Speicherbereich muss groß genug sein, um den serialisierten Wert aufzunehmen. Ist der Speicher zu klein, schlägt die Funktion fehl. Die Größe wird beim Erstellen des Bereichs via shm_attach() festgelegt.

Parameter

Name Typ Default Beschreibung
$shm Pflicht SysvSharedMemory Ein Shared-Memory-Handle, das zuvor mit shm_attach() erzeugt wurde.
$key Pflicht int Ein ganzzahliger Schlüssel, unter dem der Wert im Shared-Memory-Bereich gespeichert wird. Über denselben Schlüssel kann der Wert später mit shm_get_var() wieder abgerufen werden.
$value Pflicht mixed Der zu speichernde PHP-Wert. Kann ein beliebiger serialisierbarer Typ sein (String, Integer, Array, Objekt usw.). Ressourcen können nicht gespeichert werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Wert erfolgreich gespeichert wurde. Bei einem Fehler (z. B. zu wenig Speicher im Segment oder ungültiges Handle) wird false zurückgegeben.

Beispiele

Einfaches Speichern und Lesen eines Arrays im Shared Memory

<?php
// Gemeinsamen Speicherbereich mit einem eindeutigen Schlüssel (ftok) und 10 KB öffnen
$shmKey = ftok(__FILE__, 't');
$shm = shm_attach($shmKey, 10240);

if ($shm === false) {
    die('Shared Memory konnte nicht geöffnet werden.');
}

// Variable unter Schlüssel 1 speichern
$data = ['benutzer' => 'alice', 'punkte' => 42];
$result = shm_put_var($shm, 1, $data);

if ($result) {
    echo 'Variable erfolgreich gespeichert.' . PHP_EOL;
} else {
    echo 'Fehler beim Speichern.' . PHP_EOL;
}

// Variable wieder auslesen
$retrieved = shm_get_var($shm, 1);
print_r($retrieved);

// Speicherbereich freigeben
shm_detach($shm);
Variable erfolgreich gespeichert. Array ( [benutzer] => alice [punkte] => 42 )

Prozessübergreifende Kommunikation: Zähler erhöhen

<?php
// Schlüssel für Shared Memory
$shmKey = ftok('/tmp/counter.tmp', 'c');
touch('/tmp/counter.tmp');
$shm = shm_attach($shmKey, 1024);

const COUNTER_KEY = 42;

// Zähler initialisieren oder erhöhen
if (shm_has_var($shm, COUNTER_KEY)) {
    $counter = shm_get_var($shm, COUNTER_KEY);
    $counter++;
} else {
    $counter = 1;
}

shm_put_var($shm, COUNTER_KEY, $counter);
echo 'Aktueller Zählerstand: ' . $counter . PHP_EOL;

shm_detach($shm);
Aktueller Zählerstand: 1

// Wichtig · Fallstricke

Plattformverfügbarkeit: Die System-V-Shared-Memory-Funktionen stehen nur auf Unix-ähnlichen Betriebssystemen (Linux, macOS) zur Verfügung. Unter Windows sind sie nicht verfügbar.

Speichergröße: Ist der Shared-Memory-Bereich zu klein für den serialisierten Wert, schlägt shm_put_var() fehl. Wählen Sie daher bei shm_attach() eine ausreichende Größe. Faustregel: Den zu erwartenden serialisierten Datumfußabdruck (z. B. via strlen(serialize($value))) plus Overhead einkalkulieren.

Nebenläufigkeit: shm_put_var() bietet keine eingebaute Synchronisation. Bei parallelen Schreibzugriffen mehrerer Prozesse sollte ein Semaphor (z. B. via sem_acquire()) eingesetzt werden, um Race Conditions zu vermeiden.

Ressourcen: PHP-Ressourcen (z. B. Datenbankverbindungen, Dateihandles) können nicht gespeichert werden, da die Serialisierung sie nicht unterstützt. Solche Versuche führen zu einem Fehler.