Signatur
Beschreibung
EvIdle ist ein Watcher der PECL-Ev-Erweiterung und wird aktiv, sobald der Event-Loop "idle" ist, d. h. keine höherprioritären Ereignisse (Timer, I/O usw.) mehr anstehen. Er eignet sich ideal für Hintergrundaufgaben wie das inkrementelle Verarbeiten großer Datensätze, das Senden von Heartbeats oder das Auslösen von Garbage-Collection-Zyklen, ohne den Event-Loop zu blockieren.
Ein EvIdle-Watcher hat die niedrigste Priorität aller Watcher-Typen: Er wird erst dann aufgerufen, wenn alle I/O-, Timer- und Signal-Watcher in der aktuellen Iteration abgearbeitet wurden. Sind mehrere EvIdle-Watcher aktiv, werden sie in der Reihenfolge ihrer Registrierung aufgerufen.
Wichtig: Solange mindestens ein EvIdle-Watcher aktiv ist, kehrt der Event-Loop nie in den Schlafzustand zurück – er schleift mit 100 % CPU. Idle-Watcher sollten daher nur bei Bedarf aktiviert und bei Nichtgebrauch mit stop() deaktiviert werden.
Die Klasse erbt alle Eigenschaften und Methoden von EvWatcher, darunter start(), stop(), keepalive() und den Callback-Mechanismus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Eine aufrufbare Funktion, die der Watcher aufruft, sobald der Event-Loop im Leerlauf ist. Die Signatur lautet function(EvIdle $watcher, int $revents): void. |
|
| $data | mixed | null | Beliebige Benutzerdaten, die dem Watcher zugeordnet und über $watcher->data abrufbar sind. |
| $priority | int | 0 | Priorität des Watchers als ganzzahliger Wert. Mögliche Werte sind Ev-Konstanten wie Ev::MINPRI bis Ev::MAXPRI. |
Beispiele
Einfacher Idle-Watcher für eine Hintergrundaufgabe
<?php
// Beispiel: Inkrementelle Verarbeitung im Leerlauf
$idleWatcher = new EvIdle(function (EvIdle $w) {
static $count = 0;
echo "Idle-Tick: " . (++$count) . PHP_EOL;
if ($count >= 5) {
// Nach 5 Aufrufen den Watcher stoppen,
// damit der Event-Loop beendet werden kann.
$w->stop();
}
});
Ev::run();
Idle-Watcher kombiniert mit einem Timer
<?php
// Timer, der nach 0,5 Sekunden den Idle-Watcher deaktiviert
$timer = EvTimer::create(0.5, 0.0, function (EvTimer $t) use (&$idle) {
echo "Timer ausgelöst – Idle-Watcher wird gestoppt." . PHP_EOL;
$idle->stop();
$t->stop();
});
// Idle-Watcher: läuft so lange, bis der Timer ihn stoppt
$idle = new EvIdle(function () {
static $n = 0;
// Nur jede 10.000ste Iteration ausgeben, um Ausgabe zu begrenzen
if (++$n % 10000 === 0) {
echo "Idle aktiv ... Iteration: $n" . PHP_EOL;
}
});
Ev::run();
echo "Event-Loop beendet." . PHP_EOL;
// Wichtig · Fallstricke
CPU-Auslastung: Ein aktiver EvIdle-Watcher verhindert, dass der Event-Loop in den Schlafzustand wechselt. Dadurch steigt die CPU-Auslastung auf nahezu 100 %. Aktiviere Idle-Watcher nur, wenn tatsächlich Arbeit im Leerlauf anfällt, und stoppe sie mit $watcher->stop(), sobald keine Aufgaben mehr anstehen.
Abhängigkeit: EvIdle setzt die PECL-Erweiterung ev voraus, die nicht standardmäßig mit PHP ausgeliefert wird. Sie muss separat installiert werden (pecl install ev).
Vererbung: Da EvIdle von EvWatcher erbt, stehen alle Watcher-Methoden und -Eigenschaften zur Verfügung, darunter is_active, is_pending, keepalive() und feed().