Signatur
Beschreibung
EventUtil ist eine finale Hilfsklasse der Event-Erweiterung (PECL event), die auf der C-Bibliothek libevent basiert. Sie bietet ausschließlich statische Methoden und Konstanten; Instanzen dieser Klasse können nicht erzeugt werden.
Typische Einsatzgebiete sind das Ermitteln des zugrundeliegenden Socket-Dateideskriptors eines PHP-Streams oder einer PHP-Socket-Ressource (EventUtil::getSocketFd()), das Auslesen von Socket-Adressen (EventUtil::getSocketName()) sowie der Zugriff auf Betriebssystem-spezifische Signalnummern (EventUtil::getTimeofDay()).
Die Klasse enthält außerdem zahlreiche Klassenkonstanten, die häufig verwendete Unix-Signale (z. B. EventUtil::LIBEVENT_VERSION_NUMBER, EventUtil::SO_DEBUG) und Socket-Optionen kapseln, damit diese plattformübergreifend nutzbar sind, ohne systemspezifische Präprozessormakros einbinden zu müssen.
Da alle Methoden statisch sind, wird EventUtil direkt aufgerufen (z. B. EventUtil::getSocketFd($stream)) und dient primär als Brücke zwischen PHP-Streams/-Sockets und dem Low-Level-libevent-API.
Beispiele
Socket-Dateideskriptor eines PHP-Streams ermitteln
<?php
// Einen TCP-Stream-Socket öffnen
$stream = stream_socket_client('tcp://example.com:80', $errno, $errstr, 5);
if (!$stream) {
die("Verbindung fehlgeschlagen: $errstr ($errno)\n");
}
// Dateideskriptor via EventUtil holen
$fd = EventUtil::getSocketFd($stream);
if ($fd === false) {
die('Konnte Dateideskriptor nicht ermitteln.');
}
echo "Dateideskriptor: $fd\n";
// Jetzt kann $fd z. B. an ein Event gebunden werden
$base = new EventBase();
$event = new Event($base, $fd, Event::READ | Event::PERSIST, function ($fd, $what) {
echo "Daten auf Dateideskriptor $fd verfügbar.\n";
});
$event->add();
$base->dispatch();
fclose($stream);
Lokale Socket-Adresse und Port auslesen
<?php
// Server-Socket erstellen
$server = stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr);
if (!$server) {
die("Server konnte nicht gestartet werden: $errstr ($errno)\n");
}
$fd = EventUtil::getSocketFd($server);
// Adresse und Port des gebundenen Sockets auslesen
if (EventUtil::getSocketName($fd, $address, $port)) {
echo "Server lauscht auf: $address:$port\n";
} else {
echo "Adresse konnte nicht ermittelt werden.\n";
}
fclose($server);
// Wichtig · Fallstricke
Finale Klasse: EventUtil kann nicht erweitert werden (ist als final deklariert). Eine Instanziierung ist ebenfalls nicht möglich.
Abhängigkeit: Die Klasse steht nur zur Verfügung, wenn die PECL-Erweiterung event installiert und geladen ist (pecl install event). Sie ist nicht Teil von libevent oder event_base des älteren libevent-PECL-Pakets.
Plattformunterschiede: Einige Konstanten (z. B. Socket-Optionen) sind betriebssystemabhängig und stehen möglicherweise nicht auf allen Plattformen zur Verfügung. Prüfe vor der Verwendung mit defined(), ob die jeweilige Konstante existiert.
Rückgabe von getSocketFd(): Gibt -1 zurück, wenn der übergebene Wert kein gültiger Stream oder Socket ist; gibt false zurück, wenn ein interner Fehler auftritt. Prüfe den Rückgabewert daher stets mit striktem Vergleich (=== false bzw. === -1).