Start · Sprachen · PHP · Referenz · EventHttp

EventHttp

Klasse

Repräsentiert einen HTTP-Server, der auf Basis der <code>libevent</code>-Bibliothek asynchrone HTTP-Anfragen verarbeiten kann.

seit PHP 1.5.0 Kategorie: io

Signatur

class EventHttp

Beschreibung

EventHttp ist Teil der PECL-Event-Erweiterung und ermöglicht das Erstellen eines vollwertigen, nicht-blockierenden HTTP-Servers direkt in PHP. Der Server basiert auf der libevent-Bibliothek und integriert sich nahtlos in die ereignisgesteuerte Architektur von EventBase.

Mit EventHttp lassen sich HTTP-Server aufbauen, die beliebige Routen und Request-Handler unterstützen. Über setCallback() können für bestimmte URI-Pfade spezifische Callback-Funktionen registriert werden, während setDefaultCallback() einen Fallback-Handler für alle übrigen Anfragen definiert. Dies macht die Klasse ideal für leichtgewichtige APIs, Microservices oder Entwicklungsserver.

Der HTTP-Server nutzt das EventBase-Objekt als Grundlage für die Ereignisschleife. Er kann an mehrere Sockets oder Adressen gebunden werden (bind() und accept()), sodass flexible Netzwerkkonfigurationen möglich sind. Timeout- und maximale Verbindungsanzahl lassen sich ebenfalls konfigurieren.

Voraussetzung: Die PECL-Erweiterung event muss installiert sein. EventHttp eignet sich besonders dann, wenn hohe Parallelität bei HTTP-Anfragen ohne Threads oder klassisches Forking erreicht werden soll.

Parameter

Name Typ Default Beschreibung
$base Pflicht EventBase Das EventBase-Objekt, das als Ereignisschleife für den HTTP-Server verwendet wird.
$dns_base EventDnsBase|null null Optionales EventDnsBase-Objekt für asynchrone DNS-Auflösung. Wird null übergeben, wird DNS synchron aufgelöst.

Beispiele

Einfacher HTTP-Server mit Route und Default-Handler

<?php
$base = new EventBase();
$http = new EventHttp($base);

// Nur GET-Methode erlauben
$http->setAllowedMethods(EventHttpRequest::CMD_GET);

// Spezifischen Pfad registrieren
$http->setCallback('/hello', function (EventHttpRequest $req) {
    $buf = $req->getOutputBuffer();
    $buf->add('<h1>Hallo, Welt!</h1>');
    $req->sendReply(200, 'OK');
});

// Fallback für alle anderen Pfade
$http->setDefaultCallback(function (EventHttpRequest $req) {
    $buf = $req->getOutputBuffer();
    $buf->add('Seite nicht gefunden.');
    $req->sendReply(404, 'Not Found');
});

// Server an Port 8080 binden
$http->bind('0.0.0.0', 8080);

echo "HTTP-Server läuft auf Port 8080 ...\n";
$base->loop();
HTTP-Server läuft auf Port 8080 ...

HTTP-Server mit Timeout und maximalen Verbindungen

<?php
$base = new EventBase();
$http = new EventHttp($base);

// Timeout für eingehende Anfragen in Sekunden
$http->setTimeout(5);

// Maximale Anzahl gleichzeitiger Verbindungen
$http->setMaxConnectionsPerHost(100);

$http->setDefaultCallback(function (EventHttpRequest $req) {
    $buf = $req->getOutputBuffer();
    $uri  = $req->getUri();
    $buf->add("Angeforderte URI: " . htmlspecialchars($uri));
    $req->sendReply(200, 'OK');
});

$http->bind('127.0.0.1', 9000);
echo "Server mit Timeout=5s auf Port 9000 gestartet.\n";
$base->loop();
Server mit Timeout=5s auf Port 9000 gestartet.

// Wichtig · Fallstricke

Sicherheit: Da EventHttp direkt HTTP-Anfragen entgegennimmt, sollten alle vom Client gelieferten Daten (URI, Header, Body) sorgfältig validiert und mit htmlspecialchars() bzw. geeigneten Escape-Funktionen behandelt werden, bevor sie in Ausgaben eingebettet werden.

Produktionsbetrieb: Für produktive Deployments empfiehlt sich ein vorgelagerter Reverse-Proxy (z. B. nginx), da EventHttp keinen TLS-Support von sich aus mitbringt und fortgeschrittene HTTP-Features (z. B. HTTP/2) fehlen.

Verfügbarkeit: EventHttp erfordert die PECL-Erweiterung event (>= 1.5.0) sowie libevent >= 2.0 auf dem System. Die Klasse ist nicht Bestandteil der PHP-Standardinstallation.