Start · Sprachen · PHP · Referenz · Ev

Ev

Klasse

Die Basisklasse der Ev-Erweiterung, die den Zugriff auf die Standard-Ereignisschleife von <code>libev</code> ermöglicht.

seit PHP 0.1.0 Kategorie: io

Signatur

class Ev

Beschreibung

Ev ist die zentrale statische Klasse der PHP-Erweiterung ev (PECL). Sie kapselt die Standard-Ereignisschleife von libev und stellt statische Methoden zum Starten, Stoppen und Konfigurieren dieser Schleife bereit. Die Klasse kann nicht instanziiert werden – alle Methoden und Konstanten werden statisch verwendet.

Kern der Klasse ist die Event Loop: eine Endlosschleife, die auf I/O-Ereignisse, Timer, Signale und weitere asynchrone Ereignisquellen reagiert. Sie eignet sich besonders für Netzwerkserver, Proxys, CLI-Daemons und andere Programme, die viele gleichzeitige I/O-Operationen effizient verwalten müssen, ohne Threads einsetzen zu wollen.

Über Ev::run() wird die Schleife gestartet, über Ev::stop() kontrolliert angehalten. Neben der Standard-Schleife können mit EvLoop auch mehrere unabhängige Schleifen erzeugt werden. Ev arbeitet intern mit Watcher-Objekten (EvIo, EvTimer, EvSignal usw.), die einzelne Ereignisse überwachen.

Die Erweiterung setzt die PECL-Bibliothek ev voraus, die auf libev basiert. Sie ist nicht Teil der PHP-Standardinstallation und muss separat installiert werden (pecl install ev).

Beispiele

Einfacher Timer mit der Standard-Ereignisschleife

<?php
// Einen einmaligen Timer registrieren, der nach 2 Sekunden feuert
$timer = new EvTimer(2.0, 0.0, function () {
    echo "Timer abgelaufen!" . PHP_EOL;
    Ev::stop(); // Ereignisschleife beenden
});

echo "Starte Ereignisschleife..." . PHP_EOL;
Ev::run(); // Startet die Standard-Ereignisschleife (blockierend)
echo "Schleife beendet." . PHP_EOL;
Starte Ereignisschleife... Timer abgelaufen! Schleife beendet.

Nicht-blockierender Durchlauf mit Ev::run(Ev::RUN_NOWAIT)

<?php
// Watcher registrieren
$timer = new EvTimer(0.1, 0.0, function () {
    echo "Watcher ausgelöst" . PHP_EOL;
});

// Nur einen Durchlauf ohne Blockieren ausführen
Ev::run(Ev::RUN_NOWAIT);

echo "Schleife läuft weiter im Hauptprogramm..." . PHP_EOL;

// Vollständiger Durchlauf, verarbeitet alle ausstehenden Ereignisse
Ev::run(Ev::RUN_ONCE);

echo "Fertig." . PHP_EOL;
Schleife läuft weiter im Hauptprogramm... Watcher ausgelöst Fertig.

Versions- und Backend-Informationen der libev-Installation abfragen

<?php
// Versionsinformationen ausgeben
echo "libev Version: " . Ev::versionMajor() . "." . Ev::versionMinor() . PHP_EOL;

// Aktives Backend der Standard-Schleife ermitteln
$backend = Ev::backend();
if ($backend & Ev::BACKEND_EPOLL) {
    echo "Backend: epoll" . PHP_EOL;
} elseif ($backend & Ev::BACKEND_KQUEUE) {
    echo "Backend: kqueue" . PHP_EOL;
} elseif ($backend & Ev::BACKEND_POLL) {
    echo "Backend: poll" . PHP_EOL;
} else {
    echo "Backend: select oder anderes" . PHP_EOL;
}
libev Version: 4.33 Backend: epoll

// Wichtig · Fallstricke

Nicht instanziierbar: Die Klasse Ev darf nicht mit new Ev() instanziiert werden. Alle Methoden sind statisch.

Blocking vs. Non-blocking: Ev::run() ohne Argument blockiert den PHP-Prozess, bis keine aktiven Watcher mehr vorhanden sind oder Ev::stop() aufgerufen wird. In laufenden Webserver-Umgebungen (z. B. FPM) ist dieser Einsatz nicht empfehlenswert – die Erweiterung ist vorrangig für CLI-Daemons konzipiert.

Mehrere Schleifen: Für Multithreading-ähnliche Szenarien (z. B. in Kombination mit pthreads) sollte statt der Standard-Schleife EvLoop verwendet werden, da die Standard-Schleife nicht thread-sicher ist.

PECL-Abhängigkeit: Die Erweiterung muss über PECL installiert werden: pecl install ev. Auf Debian/Ubuntu ist das Paket php-ev verfügbar.