Signatur
Beschreibung
SyncEvent ist Teil der Sync-Erweiterung und stellt ein benanntes Synchronisationsereignis bereit, das über Prozessgrenzen hinweg verwendet werden kann. Es ist vergleichbar mit einem Windows-Event-Objekt und ermöglicht es, einen oder mehrere wartende Prozesse zu signalisieren, sobald ein bestimmtes Ereignis eingetreten ist.
Ein SyncEvent kann entweder als automatisch zurücksetzendes oder als manuell zurücksetzendes Ereignis erstellt werden. Bei automatisch zurücksetzenden Ereignissen wird der signalisierte Zustand nach dem Wecken des ersten wartenden Prozesses automatisch zurückgesetzt. Bei manuell zurücksetzenden Ereignissen bleibt der signalisierte Zustand erhalten, bis reset() explizit aufgerufen wird.
Typische Einsatzbereiche sind Produzenten-Konsumenten-Szenarien, bei denen ein Prozess darauf wartet, dass ein anderer Prozess eine Aufgabe abgeschlossen hat, oder die Koordination mehrerer paralleler Prozesse bei der Verarbeitung gemeinsamer Ressourcen.
Hinweis: Die Sync-Erweiterung muss über PECL installiert sein und steht nicht standardmäßig in PHP zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name | string | Der eindeutige Name des Ereignisses. Unter Windows wird der Name systemweit verwendet, unter Unix wird ein entsprechender Named-Semaphore- oder Shared-Memory-Eintrag erzeugt. Wird kein Name angegeben, wird ein prozess-lokales Ereignis erstellt. | |
| $manual | bool | false | Gibt an, ob das Ereignis manuell zurückgesetzt werden muss. Bei true bleibt das Ereignis signalisiert, bis reset() aufgerufen wird. Bei false (Standard) setzt sich das Ereignis automatisch zurück, nachdem ein wartender Prozess geweckt wurde. |
| $prefire | bool | false | Wenn true, wird das Ereignis beim Erstellen sofort in den signalisierten Zustand versetzt. Standardmäßig ist das Ereignis beim Erstellen nicht signalisiert. |
Beispiele
Einfache Prozesssynchronisation: Sender und Empfänger
<?php
// Prozess A: Wartet auf das Ereignis
$event = new SyncEvent('MeinEreignis', true);
echo "Warte auf Ereignis..." . PHP_EOL;
if ($event->wait()) {
echo "Ereignis empfangen! Verarbeitung beginnt." . PHP_EOL;
$event->reset(); // Manuelles Zurücksetzen bei manual=true
} else {
echo "Timeout oder Fehler beim Warten." . PHP_EOL;
}
Ereignis signalisieren aus einem anderen Prozess
<?php
// Prozess B: Signalisiert das Ereignis
$event = new SyncEvent('MeinEreignis', true);
// Simuliere eine Aufgabe
sleep(1);
echo "Aufgabe abgeschlossen, signalisiere Ereignis..." . PHP_EOL;
if ($event->fire()) {
echo "Ereignis erfolgreich signalisiert." . PHP_EOL;
} else {
echo "Fehler beim Signalisieren." . PHP_EOL;
}
Automatisch zurücksetzendes Ereignis (auto-reset)
<?php
// Erstellt ein automatisch zurücksetzendes Ereignis
$event = new SyncEvent('AutoReset', false, false);
// In einem anderen Prozess wird fire() aufgerufen,
// woraufhin genau ein wartender Prozess geweckt wird
// und das Ereignis automatisch zurückgesetzt wird.
if ($event->wait(5000)) { // Timeout: 5000 Millisekunden
echo "Ereignis empfangen (auto-reset aktiv)." . PHP_EOL;
} else {
echo "Kein Ereignis innerhalb von 5 Sekunden." . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformunterschiede: Unter Windows werden Named Events direkt vom Betriebssystem verwaltet. Unter Unix/Linux verwendet die Sync-Erweiterung Semaphoren oder Shared Memory, um ähnliches Verhalten zu emulieren. Die Namen sollten daher kompatibel mit beiden Systemen gewählt werden (z. B. keine Sonderzeichen).
Deadlock-Gefahr: Wird wait() ohne Timeout aufgerufen und fire() wird nie ausgelöst, blockiert der Prozess dauerhaft. Es empfiehlt sich stets, einen sinnvollen Timeout-Wert zu übergeben.
Ressourcen-Verwaltung: Benannte Ereignisse unter Unix werden als Systemressourcen angelegt. Bei unerwarteten Prozessabbrüchen können verwaiste Ressourcen entstehen, die manuell bereinigt werden müssen.
Erweiterung erforderlich: SyncEvent ist nicht Teil der PHP-Standardinstallation. Die Erweiterung muss via PECL (pecl install sync) installiert und in der php.ini aktiviert werden.