Signatur
Beschreibung
shm_attach() ist Teil der POSIX/SysV-Shared-Memory-Erweiterung von PHP und ermöglicht es, einen benannten Speicherbereich zu erzeugen oder – falls er bereits existiert – wieder zu öffnen. Shared Memory erlaubt mehreren Prozessen, auf denselben Speicherbereich zuzugreifen, ohne Daten über Dateien oder Netzwerksockets übertragen zu müssen. Das ist besonders sinnvoll für hochfrequente Datenaustausche zwischen PHP-CLI-Prozessen oder Worker-Prozessen unter Unix-ähnlichen Systemen.
Der Parameter key identifiziert den Speicherbereich eindeutig. Er kann zum Beispiel mit ftok() aus einem Dateinamen erzeugt werden, um sicherzustellen, dass verschiedene Prozesse denselben Schlüssel verwenden. Der Parameter size legt die Größe in Bytes fest und wird nur beim erstmaligen Anlegen berücksichtigt; bei erneutem Öffnen eines bestehenden Segments wird dieser Wert ignoriert.
Die gespeicherten Daten werden intern als serialisierte PHP-Werte abgelegt, sodass beliebige PHP-Typen (Strings, Arrays, Objekte) gespeichert werden können. Für den Zugriff auf einzelne Variablen im Segment werden die Funktionen shm_put_var(), shm_get_var() und shm_remove_var() verwendet.
Achtung: Die SysV-Shared-Memory-Erweiterung steht nur auf Unix-ähnlichen Betriebssystemen zur Verfügung. Unter Windows ist sie nicht verfügbar. Nicht freigegebene Segmente bleiben nach dem Prozessende erhalten und können Systemressourcen belegen; daher sollte shm_detach() bzw. shm_remove() immer aufgerufen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | int | Eindeutiger Systemschlüssel, der den Shared-Memory-Bereich identifiziert. Kann z. B. mit ftok() erzeugt werden. |
|
| $size | int | 10000 | Größe des Speicherbereichs in Bytes. Wird nur beim erstmaligen Anlegen des Segments verwendet; bei späterem Öffnen eines vorhandenen Segments wird dieser Parameter ignoriert. |
| $permissions | int | 0666 | Unix-Dateisystemberechtigungen als Oktalzahl, die beim Anlegen des Segments gesetzt werden. Beispiel: 0600 für Lese-/Schreibzugriff nur für den Eigentümer. |
Rückgabewert
SysvSharedMemory-Objekt zurück, das als Handle für alle weiteren Shared-Memory-Operationen verwendet wird. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfaches Schreiben und Lesen über Shared Memory
<?php
// Schlüssel aus einer Datei erzeugen, damit mehrere Prozesse denselben Bereich nutzen
$key = ftok(__FILE__, 'p');
// Shared-Memory-Bereich anlegen oder öffnen (64 KB)
$shm = shm_attach($key, 65536, 0600);
if ($shm === false) {
die('Shared Memory konnte nicht erzeugt/geöffnet werden.');
}
// Variable unter Index 1 speichern
shm_put_var($shm, 1, ['benutzer' => 'Alice', 'aktiv' => true]);
// Variable wieder auslesen
$daten = shm_get_var($shm, 1);
var_dump($daten);
// Segment abtrennen (Daten bleiben erhalten)
shm_detach($shm);
Gemeinsamen Zähler zwischen zwei Prozessen nutzen
<?php
$key = ftok('/tmp/shm_counter.lock', 'c');
$shm = shm_attach($key, 4096, 0600);
if ($shm === false) {
die('Fehler beim Öffnen des Shared Memory.');
}
// Zähler initialisieren, falls noch nicht vorhanden
if (!shm_has_var($shm, 0)) {
shm_put_var($shm, 0, 0);
}
// Zähler um 1 erhöhen (in Produktion mit Semaphore absichern!)
$aktuell = shm_get_var($shm, 0);
shm_put_var($shm, 0, $aktuell + 1);
echo 'Aktueller Zählerstand: ' . shm_get_var($shm, 0) . PHP_EOL;
shm_detach($shm);
// Wichtig · Fallstricke
Race Conditions: Greifen mehrere Prozesse gleichzeitig lesend und schreibend auf denselben Shared-Memory-Bereich zu, können Race Conditions entstehen. Verwenden Sie sem_acquire() und sem_release() aus der SysV-Semaphore-Erweiterung, um kritische Abschnitte abzusichern.
Ressourcenlecks: Nicht entfernte Shared-Memory-Segmente verbleiben im System, auch wenn alle PHP-Prozesse beendet wurden. Prüfen und bereinigen Sie verwaiste Segmente mit dem Kommandozeilenbefehl ipcs -m und ipcrm -m <id>.
Plattformverfügbarkeit: Die Funktion ist ausschließlich auf Unix-ähnlichen Systemen (Linux, macOS) verfügbar. Unter Windows steht sie nicht zur Verfügung. Die Erweiterung muss beim Kompilieren von PHP mit --enable-sysvshm aktiviert worden sein.
Rückgabewert ab PHP 8.0: Seit PHP 8.0 wird statt einer Resource ein SysvSharedMemory-Objekt zurückgegeben.