Start · Sprachen · PHP · Referenz · sem_get

sem_get

Funktion

Erzeugt oder öffnet einen System-V-Semaphor und gibt ein <code>SysvSemaphore</code>-Objekt zurück, das zur Prozess-Synchronisation verwendet werden kann.

seit PHP 4.0.0 Kategorie: misc

Signatur

sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): SysvSemaphore|false

Beschreibung

sem_get() fordert Zugriff auf einen System-V-Semaphor an. Der Semaphor wird anhand eines ganzzahligen Schlüssels ($key) identifiziert. Existiert noch kein Semaphor mit diesem Schlüssel, wird er neu angelegt. Andernfalls wird der bestehende Semaphor geöffnet. Das zurückgegebene SysvSemaphore-Objekt kann anschließend mit sem_acquire() und sem_release() verwendet werden.

Semaphore dienen der Synchronisation mehrerer Prozesse oder Threads, die auf gemeinsame Ressourcen (z. B. Shared Memory oder Dateien) zugreifen. Durch den Parameter $max_acquire lässt sich steuern, wie viele Prozesse den Semaphor gleichzeitig halten dürfen – typischerweise 1 für einen gegenseitigen Ausschluss (Mutex).

Der Parameter $auto_release sorgt dafür, dass der Semaphor beim Beenden des Prozesses automatisch freigegeben wird, was Deadlocks durch unerwartet beendete Prozesse verhindert. Der Schlüssel kann bequem mit ftok() aus einem Dateipfad und einer Projekt-ID generiert werden.

Hinweis: Diese Funktion setzt die System-V-IPC-Erweiterung (sysvsem) voraus und ist daher nur unter Unix-ähnlichen Betriebssystemen verfügbar.

Parameter

Name Typ Default Beschreibung
$key Pflicht int Ein ganzzahliger Schlüssel, der den Semaphor im System eindeutig identifiziert. Kann z. B. mit ftok() erzeugt werden.
$max_acquire int 1 Maximale Anzahl von Prozessen, die den Semaphor gleichzeitig halten dürfen. Standard ist 1 (Mutex-Verhalten).
$permissions int 0666 Oktal-Berechtigungen für den Semaphor, ähnlich wie bei Dateiberechtigungen. Wird nur beim Erstellen eines neuen Semaphors berücksichtigt.
$auto_release bool true Gibt an, ob der Semaphor beim Beenden des Prozesses automatisch freigegeben werden soll. Empfohlen, um Deadlocks zu vermeiden.

Rückgabewert

Typ
SysvSemaphore|false
Beschreibung
Gibt bei Erfolg ein SysvSemaphore-Objekt zurück, das für sem_acquire(), sem_release() und sem_remove() verwendet werden kann. Bei einem Fehler wird false zurückgegeben.

Beispiele

Einfacher gegenseitiger Ausschluss (Mutex) zwischen Prozessen

<?php
// Schlüssel aus Datei und Projekt-ID erzeugen
$key = ftok(__FILE__, 'A');

// Semaphor öffnen oder erstellen (max. 1 Prozess gleichzeitig)
$sem = sem_get($key, 1, 0666, true);
if ($sem === false) {
    die('Semaphor konnte nicht erstellt werden.');
}

// Semaphor anfordern (blockiert, bis er verfügbar ist)
if (sem_acquire($sem)) {
    echo 'Kritischer Abschnitt wird ausgeführt...' . PHP_EOL;
    // Hier: Zugriff auf gemeinsame Ressource
    sleep(1);

    // Semaphor freigeben
    sem_release($sem);
    echo 'Fertig.' . PHP_EOL;
} else {
    echo 'Semaphor konnte nicht angefordert werden.' . PHP_EOL;
}
?>
Kritischer Abschnitt wird ausgeführt... Fertig.

Semaphor mit mehreren gleichzeitigen Zugriffen (Zähler-Semaphor)

<?php
// Schlüssel aus einer fixen Datei und Projekt-ID erzeugen
$key = ftok('/tmp', 'B');

// Bis zu 3 Prozesse dürfen gleichzeitig zugreifen
$sem = sem_get($key, 3, 0600, true);
if ($sem === false) {
    die('Semaphor konnte nicht erstellt werden.');
}

if (sem_acquire($sem)) {
    echo 'Einer von maximal 3 Prozessen ist aktiv.' . PHP_EOL;
    // Ressource nutzen ...
    sem_release($sem);
}

// Semaphor komplett entfernen (nur wenn kein Prozess mehr zugreift)
sem_remove($sem);
echo 'Semaphor entfernt.' . PHP_EOL;
?>
Einer von maximal 3 Prozessen ist aktiv. Semaphor entfernt.

// Wichtig · Fallstricke

Plattformverfügbarkeit: sem_get() ist nur auf Unix-ähnlichen Systemen verfügbar (Linux, macOS usw.) und steht unter Windows nicht zur Verfügung. Die PHP-Erweiterung sysvsem muss aktiviert sein.

Ressourcenverwaltung: Semaphore existieren systemweit und unabhängig vom PHP-Prozess. Werden sie nicht mit sem_remove() entfernt, bleiben sie auch nach dem Programmende im System bestehen und können das Limit für IPC-Ressourcen des Betriebssystems erschöpfen. Mit ipcs -s und ipcrm -s lassen sie sich auf der Kommandozeile inspizieren und entfernen.

Deadlock-Gefahr: Wenn ein Prozess einen Semaphor anfordert, aber nie freigibt (z. B. wegen eines Fehlers), können andere Prozesse dauerhaft blockieren. Der Parameter $auto_release = true mildert dieses Risiko für den Fall eines Prozess-Absturzes.