Signatur
Beschreibung
EvCheck ist ein spezieller Watcher aus der PECL-Erweiterung ev, der am Ende jeder Iteration des Event-Loops aufgerufen wird – also nach der Verarbeitung aller anderen Ereignisse. Er bildet zusammen mit EvPrepare ein komplementäres Paar: EvPrepare wird vor dem Polling ausgelöst, EvCheck danach.
Typische Einsatzgebiete sind das Prüfen auf Zustandsänderungen, das Verarbeiten von internen Warteschlangen oder das Auslösen von Aktionen, die erst dann sinnvoll sind, wenn alle I/O-Ereignisse einer Runde abgearbeitet wurden. Zum Beispiel lassen sich damit aufgelaufene Nachrichten oder Datenpuffer verarbeiten, die während der aktuellen Loop-Iteration entstanden sind.
Da EvCheck-Watcher nach jedem Loop-Durchlauf feuern, sollte die Callback-Funktion möglichst effizient sein, um den Event-Loop nicht zu verlangsamen. Das Starten oder Aktivieren von EvCheck-Watchern innerhalb eines EvPrepare-Callbacks ist ein verbreitetes Muster zur Steuerung des Loop-Verhaltens.
EvCheck erbt alle allgemeinen Watcher-Methoden von EvWatcher wie start(), stop(), keepalive() und feed().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Eine aufrufbare Funktion, die am Ende jeder Event-Loop-Iteration aufgerufen wird. Sie erhält den Watcher und ein Bitfeld der ausgelösten Ereignisse als Parameter. | |
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die dem Watcher zugeordnet werden und über $watcher->data zugänglich sind. |
| $priority | int | 0 | Priorität des Watchers. Höhere Werte bedeuten höhere Priorität. Gültige Werte liegen im Bereich Ev::MINPRI bis Ev::MAXPRI. |
Beispiele
Einfacher EvCheck-Watcher, der nach jeder Loop-Iteration ausgeführt wird
<?php
// EvCheck-Watcher anlegen: wird nach jeder Iteration des Ev-Loops ausgelöst
$check = new EvCheck(function (EvCheck $watcher, int $revents) {
echo "EvCheck ausgelöst – Iteration abgeschlossen." . PHP_EOL;
}, null, 0);
// Einen einfachen Timer, der den Loop nach 0,1 Sekunden beendet
$timer = new EvTimer(0.1, 0, function (EvTimer $w) {
echo "Timer abgelaufen – Loop wird gestoppt." . PHP_EOL;
Ev::stop(Ev::BREAK_ALL);
});
// Event-Loop starten
Ev::run();
?>
Zusammenspiel von EvPrepare und EvCheck
<?php
// EvPrepare: wird VOR dem I/O-Polling ausgelöst
$prepare = new EvPrepare(function (EvPrepare $watcher, int $revents) {
echo "EvPrepare: Vor dem Polling." . PHP_EOL;
});
// EvCheck: wird NACH dem I/O-Polling ausgelöst
$check = new EvCheck(function (EvCheck $watcher, int $revents) {
echo "EvCheck: Nach dem Polling – Ereignisse verarbeitet." . PHP_EOL;
});
// Timer, der den Loop nach kurzer Zeit beendet
$timer = new EvTimer(0.05, 0, function () {
Ev::stop(Ev::BREAK_ALL);
});
Ev::run();
?>
// Wichtig · Fallstricke
Achtung: EvCheck-Watcher feuern nach jeder Loop-Iteration, auch wenn keine I/O-Ereignisse aufgetreten sind. Schwere Berechnungen im Callback können den gesamten Event-Loop blockieren und die Reaktionsfähigkeit beeinträchtigen.
Die Klasse EvCheck gehört zur PECL-Erweiterung ev, die separat installiert werden muss (pecl install ev). Sie ist nicht im PHP-Kern enthalten.
Innerhalb eines EvCheck-Callbacks sollten keine neuen EvCheck-Watcher gestartet werden, die ihrerseits wieder EvCheck-Callbacks auslösen, da dies zu unerwarteten Rekursionen führen kann.