Start · Sprachen · PHP · Referenz · EvPrepare

EvPrepare

Klasse

Watcher, der zu Beginn jeder Iteration des Ev-Event-Loops ausgelöst wird, bevor andere Watcher bedient werden.

Kategorie: io

Signatur

class EvPrepare extends EvWatcher

Beschreibung

EvPrepare ist ein spezieller Watcher aus der PECL-Erweiterung ev. Er wird am Anfang jeder Event-Loop-Iteration aufgerufen – noch bevor andere Ereignis-Watcher (z. B. I/O- oder Timer-Watcher) aktiviert werden. Typischerweise wird er zusammen mit EvCheck eingesetzt: EvPrepare tritt vor dem Blockieren (Warten auf Ereignisse), EvCheck tritt nach dem Blockieren auf.

Sinnvoll ist EvPrepare immer dann, wenn vor jedem Durchlauf des Ev-Loops Vorbereitungsarbeiten anfallen, beispielsweise das Aktualisieren von Zuständen, das Einleiten eigener Sub-Loops oder das Integrieren anderer Event-Mechanismen. Ein häufiger Anwendungsfall ist die Integration fremder Event-Libraries in den Ev-Loop.

Die Callback-Funktion erhält den Watcher selbst und eine Bitmaske der aufgetretenen Ereignisse als Parameter. Da EvPrepare-Callbacks vor dem Schlafen des Loops ausgeführt werden, sollten sie keine langen blockierenden Operationen enthalten, da sonst die Reaktionsfähigkeit des gesamten Event-Loops leidet.

  • Priorität: Höhere Priorität-Watcher werden zuerst bedient.
  • Achtung: Es ist nicht erlaubt, innerhalb eines EvPrepare-Callbacks den Ev-Loop zu stoppen und wieder zu starten.

Parameter

Name Typ Default Beschreibung
$callback Pflicht callable Callback-Funktion, die zu Beginn jeder Event-Loop-Iteration aufgerufen wird. Signatur: function(EvPrepare $watcher, int $revents): void.
$data mixed null Beliebige Benutzerdaten, die dem Watcher zugeordnet werden und über $watcher->data abrufbar sind.
$priority int 0 Priorität des Watchers. Gültige Werte: Ev::MINPRI bis Ev::MAXPRI. Watcher mit höherer Priorität werden bevorzugt behandelt.

Beispiele

Einfacher EvPrepare-Watcher, der vor jeder Loop-Iteration eine Meldung ausgibt

<?php
// EvPrepare wird vor jeder Iteration des Event-Loops ausgelöst
$prepare = new EvPrepare(function (EvPrepare $watcher, int $revents) {
    echo "Vor der nächsten Event-Loop-Iteration." . PHP_EOL;
});

// Einen einfachen Timer erstellen, der nach 0.5 Sekunden stoppt
$timer = new EvTimer(0.5, 0, function (EvTimer $watcher) {
    echo "Timer abgelaufen – Loop wird beendet." . PHP_EOL;
    Ev::stop();
});

// Event-Loop starten
Ev::run();
Vor der nächsten Event-Loop-Iteration. Vor der nächsten Event-Loop-Iteration. Timer abgelaufen – Loop wird beendet.

Kombination von EvPrepare und EvCheck zur Laufzeitmessung

<?php
$startTime = 0.0;

// EvPrepare: wird BEVOR der Loop auf Ereignisse wartet, aufgerufen
$prepare = new EvPrepare(function () use (&$startTime) {
    $startTime = microtime(true);
    echo "EvPrepare: Start gemessen." . PHP_EOL;
});

// EvCheck: wird NACHDEM der Loop auf Ereignisse gewartet hat, aufgerufen
$check = new EvCheck(function () use (&$startTime) {
    $elapsed = microtime(true) - $startTime;
    echo sprintf("EvCheck: Wartezeit %.4f Sekunden." . PHP_EOL, $elapsed);
});

// Timer, der den Loop nach einer Iteration beendet
$timer = new EvTimer(0.1, 0, function () {
    Ev::stop();
});

Ev::run();
EvPrepare: Start gemessen. EvCheck: Wartezeit 0.1003 Sekunden.

// Wichtig · Fallstricke

Achtung: Innerhalb eines EvPrepare-Callbacks darf der laufende Event-Loop nicht mit Ev::stop() angehalten und unmittelbar neu gestartet werden, da dies zu undefiniertem Verhalten führen kann. Zum Beenden des Loops sollte stattdessen ein EvCheck- oder Timer-Callback verwendet werden.

EvPrepare steht nur zur Verfügung, wenn die PECL-Erweiterung ev installiert und aktiviert ist (pecl install ev). Sie basiert auf der nativen libev-Bibliothek.

Da EvPrepare bei jeder Iteration ausgelöst wird, können rechenintensive Callbacks spürbare Auswirkungen auf die Performance des gesamten Event-Loops haben. Callbacks sollten daher so schlank wie möglich gehalten werden.