Start · Sprachen · PHP · Referenz · EvWatcher

EvWatcher

Klasse

Die abstrakte Basisklasse für alle Ev-Watcher in der <code>Ev</code>-Erweiterung; stellt gemeinsame Eigenschaften und Methoden für alle Watcher-Typen bereit.

seit PHP 0.1.0 Kategorie: io

Signatur

abstract class EvWatcher

Beschreibung

EvWatcher ist die abstrakte Elternklasse aller Watcher-Objekte in der PHP-Ev-Erweiterung (libev-Binding). Ein Watcher beobachtet ein bestimmtes Ereignis — etwa Lesbarkeit eines Dateideskriptors, einen Timer-Ablauf oder ein Signal — und ruft eine Callback-Funktion auf, sobald das Ereignis eintritt.

Da EvWatcher abstrakt ist, wird sie nie direkt instanziiert. Stattdessen arbeitet man mit konkreten Unterklassen wie EvIo, EvTimer, EvPeriodic, EvSignal, EvChild, EvStat, EvIdle, EvPrepare, EvCheck, EvEmbed oder EvFork.

Alle Watcher teilen sich gemeinsame Zustände (aktiv, ausstehend) sowie Methoden zum Starten, Stoppen, Fortsetzen und Abfragen. Über die Eigenschaft $priority kann die Ausführungsreihenfolge beeinflusst werden. Die Eigenschaft $data erlaubt es, beliebige Benutzerdaten am Watcher-Objekt zu speichern.

EvWatcher ist besonders geeignet für hochperformante, nicht-blockierende I/O-Applikationen wie Netzwerk-Server oder Echtzeit-Datenverarbeitung, bei denen viele Ereignisse gleichzeitig überwacht werden müssen.

Beispiele

EvIo-Watcher für lesbare Standard-Eingabe

<?php
// Erstellt einen EvIo-Watcher (Unterklasse von EvWatcher),
// der auf lesbare Daten von STDIN wartet.
$watcher = new EvIo(STDIN, Ev::READ, function (EvIo $watcher, int $revents) {
    $line = fgets(STDIN);
    echo 'Eingabe empfangen: ' . $line;
    // Watcher nach erster Eingabe stoppen
    $watcher->stop();
});

// Eigenschaften, die EvWatcher bereitstellt:
echo 'Aktiv: '    . ($watcher->is_active  ? 'ja' : 'nein') . PHP_EOL;
echo 'Ausstehend: ' . ($watcher->is_pending ? 'ja' : 'nein') . PHP_EOL;

Ev::run();
?>
Aktiv: ja Ausstehend: nein

Priorität und Benutzerdaten am Watcher setzen

<?php
// EvTimer ist ebenfalls eine Unterklasse von EvWatcher
$timer = new EvTimer(1.0, 0.0, function (EvTimer $w) {
    echo 'Timer ausgelöst, data: ' . $w->data . PHP_EOL;
    $w->stop();
});

// Benutzerdaten speichern (EvWatcher::$data)
$timer->data = 'Mein Kontext';

// Priorität setzen (EvWatcher::$priority)
$timer->priority = Ev::MAXPRI;

echo 'Priorität: ' . $timer->priority . PHP_EOL;

Ev::run();
?>
Priorität: 2 Timer ausgelöst, data: Mein Kontext

// Wichtig · Fallstricke

Abstrakt: EvWatcher kann nicht direkt instanziiert werden. Immer eine konkrete Unterklasse verwenden.

Lebenszeit: Ein Watcher bleibt aktiv, solange eine PHP-Variable auf das Objekt zeigt. Wird das Objekt freigegeben (Garbage Collection), wird der Watcher automatisch gestoppt. Daher Watcher-Objekte stets in einer Variable speichern, die für die gesamte Laufzeit gültig ist.

Thread-Sicherheit: libev und damit die Ev-Erweiterung sind nicht thread-sicher. Watcher sollten nur innerhalb desselben Threads manipuliert werden, in dem die Event-Loop läuft.

Callback-Ausnahmen: Exceptions, die innerhalb des Watcher-Callbacks geworfen werden, beenden die Event-Loop nicht automatisch; sie sollten innerhalb des Callbacks gefangen und behandelt werden.