Start · Sprachen · PHP · Referenz · EvIdle

EvIdle

Klasse

Ein <code>EvIdle</code>-Watcher wird ausgelöst, wenn der Ev-Event-Loop keine anderen ausstehenden Ereignisse zu verarbeiten hat.

Kategorie: io

Signatur

class EvIdle extends EvWatcher

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-Tick: 1 Idle-Tick: 2 Idle-Tick: 3 Idle-Tick: 4 Idle-Tick: 5

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().