Signatur
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
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;
}
?>
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;
?>
// 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.