Signatur
Beschreibung
EvTimer ist ein Watcher aus der PHP-ev-Erweiterung, der auf dem Event-Loop von libev basiert. Er löst nach einer konfigurierbaren Wartezeit (after) erstmals aus und kann danach in einem festen Wiederholungsintervall (repeat) erneut feuern. Ist repeat gleich 0.0, handelt es sich um einen einmaligen Timer (One-Shot).
Timer eignen sich für zeitgesteuerte Aktionen innerhalb eines asynchronen Event-Loops, z. B. für Timeouts, periodische Aufgaben oder verzögerte Ausführung von Callbacks. Im Gegensatz zu EvPeriodic richtet sich EvTimer nach Echtzeit-Abläufen relativ zum Startzeitpunkt und nicht nach Kalenderzeiten.
Der Watcher kann jederzeit über stop(), start() und again() gesteuert werden. Die Methode again() setzt den Timer auf seinen Ausgangszustand zurück, was besonders bei der Implementierung von Inaktivitäts-Timeouts (Watchdog-Muster) praktisch ist.
Wichtig: EvTimer berücksichtigt keine Systemuhr-Sprünge (z. B. NTP-Anpassungen), da er monotone Zeitquellen verwendet. Für kalenderbasierte Ereignisse sollte stattdessen EvPeriodic verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $after Pflicht | float | Wartezeit in Sekunden (als Gleitkommazahl), nach der der Timer zum ersten Mal auslöst. | |
| $repeat Pflicht | float | Wiederholungsintervall in Sekunden. Ist der Wert 0.0, löst der Timer nur einmal aus (One-Shot). Andernfalls wird der Callback in diesem Abstand wiederholt aufgerufen. |
|
| $callback Pflicht | callable | Die Callback-Funktion, die aufgerufen wird, wenn der Timer auslöst. Sie erhält den Watcher-Instanz und ein Bitfeld der empfangenen Ereignisse als Parameter. | |
| $data | mixed | null | Benutzerdefinierte Daten, die dem Watcher zugeordnet werden. Auf sie kann über $watcher->data zugegriffen werden. |
| $priority | int | 0 | Priorität des Watchers. Höhere Werte bedeuten höhere Priorität. Gültige Werte liegen im Bereich von Ev::MINPRI bis Ev::MAXPRI. |
Beispiele
Einmaliger Timer nach 2 Sekunden
<?php
// Einmaliger Timer, der nach 2 Sekunden eine Nachricht ausgibt
$timer = new EvTimer(2.0, 0.0, function (EvTimer $watcher) {
echo "Timer ausgelöst nach 2 Sekunden!" . PHP_EOL;
// One-Shot: repeat=0.0, daher stoppt sich der Timer selbst
$watcher->stop();
});
Ev::run();
Periodischer Timer mit Wiederholung
<?php
// Timer, der nach 1 Sekunde startet und dann alle 0,5 Sekunden feuert
$count = 0;
$timer = new EvTimer(1.0, 0.5, function (EvTimer $watcher) use (&$count) {
$count++;
echo "Tick #{$count}" . PHP_EOL;
if ($count >= 5) {
$watcher->stop(); // Watcher anhalten nach 5 Durchläufen
Ev::stop(); // Event-Loop beenden
}
});
Ev::run();
Watchdog-Muster mit again()
<?php
// Inaktivitäts-Timeout: wird bei jeder Aktivität zurückgesetzt
$watchdog = new EvTimer(5.0, 0.0, function () {
echo "Keine Aktivität seit 5 Sekunden – Timeout!" . PHP_EOL;
Ev::stop();
});
$io = new EvIO(STDIN, Ev::READ, function () use ($watchdog) {
fgets(STDIN); // Eingabe lesen
echo "Aktivität erkannt, Timer zurückgesetzt." . PHP_EOL;
$watchdog->again(); // Startet den 5s-Timer neu
});
Ev::run();
// Wichtig · Fallstricke
Monotone Zeit: EvTimer verwendet eine monotone Uhr und ist daher immun gegen Systemuhr-Anpassungen (z. B. durch NTP). Für absolute Kalender-Zeiten sollte EvPeriodic eingesetzt werden.
Minimale Auflösung: Sehr kleine Intervalle (< 1 ms) können je nach Betriebssystem und Last ungenau sein. Timer sind keine Echtzeit-Garantien.
Ressourcen: Nicht mehr benötigte Watcher sollten mit stop() angehalten oder durch Aufhebung aller Referenzen freigegeben werden, damit der Event-Loop korrekt terminieren kann.
Erweiterung erforderlich: EvTimer erfordert die PECL-Erweiterung ev, die standardmäßig nicht in PHP enthalten ist.