Start · Sprachen · PHP · Referenz · SysvSemaphore

SysvSemaphore

Klasse

Repräsentiert ein System-V-Semaphor-Objekt, das zur Prozess-Synchronisation unter Unix/Linux verwendet wird.

seit PHP 8.0.0 Kategorie: misc

Signatur

class SysvSemaphore

Beschreibung

SysvSemaphore ist eine opake Klasse, die seit PHP 8.0 als objektorientierter Ersatz für die frühere Semaphor-Ressource verwendet wird. Instanzen dieser Klasse werden ausschließlich durch den Aufruf von sem_get() erzeugt und repräsentieren ein System-V-IPC-Semaphor des Betriebssystems.

System-V-Semaphore dienen der Synchronisation paralleler Prozesse: Sie ermöglichen es, kritische Abschnitte zu schützen, sodass immer nur eine festgelegte Anzahl von Prozessen gleichzeitig auf eine gemeinsame Ressource zugreifen kann. Typische Anwendungsfälle sind der Zugriff auf gemeinsam genutzten Speicher (SysvSharedMemory), Datenbankverbindungen oder andere exklusiv zu nutzende Ressourcen in Multi-Prozess-Szenarien.

Mit sem_acquire() kann ein Prozess das Semaphor belegen (und wartet gegebenenfalls, bis es freigegeben wird), mit sem_release() wird es wieder freigegeben. sem_remove() entfernt das Semaphor vollständig aus dem System. Da es sich um System-V-IPC handelt, sind diese Semaphore persistent und überleben das Ende des PHP-Prozesses, sofern sie nicht explizit entfernt werden.

Hinweis: Diese Klasse steht nur auf Systemen zur Verfügung, die System-V-IPC unterstützen (Linux, macOS usw.). Unter Windows ist sie nicht verfügbar. Die Erweiterung muss beim Kompilieren von PHP mit der Option --enable-sysvsem aktiviert worden sein.

Beispiele

Semaphor erzeugen und kritischen Abschnitt schützen

<?php
// Semaphor mit Schlüssel 12345 erzeugen (max. 1 gleichzeitiger Zugriff)
$semaphore = sem_get(12345, 1);

if ($semaphore === false) {
    die('Semaphor konnte nicht erzeugt werden.');
}

// Kritischen Abschnitt betreten (blockiert, bis das Semaphor frei ist)
if (sem_acquire($semaphore)) {
    echo "Kritischer Abschnitt wird ausgeführt..." . PHP_EOL;

    // Hier: exklusiver Zugriff auf eine gemeinsame Ressource
    sleep(1);

    echo "Fertig. Semaphor wird freigegeben." . PHP_EOL;
    sem_release($semaphore);
} else {
    echo "Semaphor konnte nicht belegt werden." . PHP_EOL;
}
?>
Kritischer Abschnitt wird ausgeführt... Fertig. Semaphor wird freigegeben.

Semaphor mit gemeinsamem Speicher kombinieren

<?php
$key = ftok(__FILE__, 'a'); // Eindeutigen IPC-Schlüssel aus Datei ableiten

$sem = sem_get($key, 1);
$shm = shm_attach($key, 1024);

if ($sem === false || $shm === false) {
    die('IPC-Ressourcen konnten nicht erzeugt werden.');
}

sem_acquire($sem);

// Gemeinsamen Speicher exklusiv lesen und schreiben
$counter = shm_has_var($shm, 1) ? shm_get_var($shm, 1) : 0;
$counter++;
shm_put_var($shm, 1, $counter);

echo "Zählerstand: $counter" . PHP_EOL;

sem_release($sem);

// Aufräumen (nur beim letzten Prozess aufrufen)
// shm_remove($shm);
// sem_remove($sem);
?>
Zählerstand: 1

// Wichtig · Fallstricke

Persistenz: System-V-Semaphore bleiben auch nach dem Ende des PHP-Prozesses im Betriebssystem erhalten. Wird sem_remove() nicht aufgerufen, können verwaiste Semaphore das System-Limit für IPC-Ressourcen erschöpfen. Mit dem Shell-Befehl ipcs -s können vorhandene Semaphore angezeigt und mit ipcrm -s <semid> manuell entfernt werden.

Deadlock-Gefahr: Wenn ein Prozess ein Semaphor mit sem_acquire() belegt und dann abstürzt, ohne sem_release() aufzurufen, wird das Semaphor vom Betriebssystem automatisch freigegeben, sofern das dritte Argument $auto_release von sem_get() auf true (Standardwert) gesetzt ist.

Verfügbarkeit: Die Klasse existiert nur auf Plattformen mit System-V-IPC-Unterstützung. Für portable Multi-Prozess-Synchronisation unter verschiedenen Betriebssystemen sollten Alternativen wie Datei-Sperren mit flock() in Betracht gezogen werden.