Start · Sprachen · PHP · Referenz · EvCheck

EvCheck

Klasse

Ein <code>EvCheck</code>-Watcher wird am Ende jeder Iteration des Ev-Event-Loops ausgelöst, nachdem alle ausstehenden Ereignisse verarbeitet wurden.

Kategorie: io

Signatur

class EvCheck extends EvWatcher

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();
?>
EvCheck ausgelöst – Iteration abgeschlossen. Timer abgelaufen – Loop wird gestoppt. EvCheck ausgelöst – Iteration abgeschlossen.

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();
?>
EvPrepare: Vor dem Polling. EvCheck: Nach dem Polling – Ereignisse verarbeitet. EvPrepare: Vor dem Polling. EvCheck: Nach dem Polling – Ereignisse verarbeitet.

// 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.