Signatur
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 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();
// 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.