Signatur
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();
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();
// 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.