Start · Sprachen · PHP · Referenz · SyncSharedMemory

SyncSharedMemory

Klasse

Repräsentiert einen benannten, prozessübergreifenden Bereich für gemeinsam genutzten Speicher (Shared Memory), der über die PECL-Erweiterung <code>sync</code> bereitgestellt wird.

seit PHP 1.0.0 Kategorie: misc

Signatur

class SyncSharedMemory

Beschreibung

SyncSharedMemory ermöglicht es mehreren PHP-Prozessen, auf denselben benannten Speicherbereich zuzugreifen und Daten darüber auszutauschen. Im Gegensatz zu flüchtigen Mechanismen wie shmop oder POSIX-Shared-Memory ist der Speicherbereich über einen Namen (String) adressierbar und plattformübergreifend unter Windows und Unix verfügbar.

Typische Einsatzgebiete sind Interprozesskommunikation (IPC) zwischen parallel laufenden PHP-CLI-Prozessen, Worker-Prozessen in einer Queue-Verarbeitung oder zwischen einem Webserver-Prozess und einem Hintergrund-Daemon. Der benannte Bereich bleibt so lange bestehen, wie mindestens ein Prozess eine Referenz darauf hält.

Da mehrere Prozesse gleichzeitig lesend und schreibend auf den Bereich zugreifen können, ist eine externe Synchronisation – etwa mit SyncMutex oder SyncSemaphore aus derselben sync-Erweiterung – zwingend erforderlich, um Race Conditions und Datenverlust zu vermeiden.

Voraussetzung: Die PECL-Erweiterung sync muss installiert und aktiviert sein (pecl install sync).

Parameter

Name Typ Default Beschreibung
$name Pflicht string Eindeutiger Name des gemeinsam genutzten Speicherbereichs. Unter Windows wird ein benanntes Objekt erstellt; unter Unix wird ein POSIX-Shared-Memory-Segment mit diesem Namen angelegt. Der Name sollte mit einem Schrägstrich beginnen, z. B. /myapp_shm.
$size Pflicht int Größe des Speicherbereichs in Bytes. Wird der Bereich neu erstellt, wird er mit dieser Größe angelegt. Existiert er bereits, muss die Größe übereinstimmen, andernfalls schlägt der Konstruktor fehl.

Beispiele

Schreiben und Lesen zwischen zwei Prozessen

<?php
// Prozess A: schreibt einen Wert in den Shared Memory
$mutex = new SyncMutex('myapp_mutex');
$shm   = new SyncSharedMemory('/myapp_shm', 64);

$mutex->lock();
$shm->write('Hallo aus Prozess A!', 0);
$mutex->unlock();

echo 'Prozess A hat geschrieben.' . PHP_EOL;
Prozess A hat geschrieben.

Lesen des Shared-Memory-Bereichs aus einem zweiten Prozess

<?php
// Prozess B: liest den Wert, den Prozess A geschrieben hat
$mutex = new SyncMutex('myapp_mutex');
$shm   = new SyncSharedMemory('/myapp_shm', 64);

$mutex->lock();
$data = $shm->read(0, 20); // Offset 0, 20 Bytes lesen
$mutex->unlock();

echo 'Prozess B liest: ' . rtrim($data, "\0") . PHP_EOL;
Prozess B liest: Hallo aus Prozess A!

Prüfen, ob der Shared-Memory-Bereich neu erstellt wurde

<?php
$shm = new SyncSharedMemory('/myapp_counter', 8);

if ($shm->first()) {
    // Erster Zugriff: Speicher initialisieren
    $shm->write(pack('q', 0), 0);
    echo 'Speicher initialisiert.' . PHP_EOL;
} else {
    $raw   = $shm->read(0, 8);
    $value = unpack('q', $raw)[1];
    echo 'Aktueller Zählerstand: ' . $value . PHP_EOL;
}
Speicher initialisiert.

// Wichtig · Fallstricke

Race Conditions: SyncSharedMemory bietet selbst keinerlei Synchronisation. Ohne einen begleitenden SyncMutex oder eine SyncSemaphore können gleichzeitige Schreibzugriffe zu korrupten Daten führen. Sperren Sie den Mutex immer vor jedem Lese- und Schreibvorgang.

Größe ist unveränderlich: Die Größe des Speicherbereichs wird beim ersten Anlegen festgelegt und kann nachträglich nicht geändert werden. Planen Sie ausreichend Puffer ein oder versionieren Sie den Namen bei Größenänderungen.

Plattformunterschiede: Unter Windows basiert die Implementierung auf Named Shared Memory; unter Unix auf POSIX Shared Memory (shm_open). Der Name sollte daher auf beiden Plattformen mit einem Schrägstrich beginnen.

Persistenz: Der Speicherbereich wird freigegeben, sobald alle Prozesse, die ihn geöffnet haben, beendet werden. Es gibt keine automatische Persistenz über Neustarts hinweg.