Start · Sprachen · PHP · Referenz · EventUtil

EventUtil

Klasse

Stellt statische Dienstprogrammfunktionen und Konstanten der <code>Event</code>-Erweiterung (libevent) bereit.

seit PHP 1.2.6 Kategorie: io

Signatur

class EventUtil

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);
Dateideskriptor: 5

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);
Server lauscht auf: 127.0.0.1:54321

// 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).