Signatur
Beschreibung
EventHttpConnection ist Teil der Event-PECL-Erweiterung und kapselt eine HTTP-Verbindung auf Basis der libevent-Bibliothek. Sie ermöglicht es, asynchrone HTTP-Anfragen an einen Server zu senden, ohne den Prozess zu blockieren – ideal für hochperformante, nicht-blockierende I/O-Anwendungen.
Ein typischer Anwendungsfall ist das Versenden von HTTP-Requests (GET, POST usw.) im Rahmen eines Event-Loops (EventBase). Die Verbindung wird mit einem optionalen DNS-Resolver und einem SSL-Kontext erstellt, was TLS/HTTPS-Verbindungen ermöglicht.
Durch die Kombination von EventHttpConnection und EventHttpRequest lassen sich vollständige HTTP-Client-Workflows abbilden: Anfrage erstellen, Callback für die Antwort registrieren und den Event-Loop starten. Dieses Modell eignet sich besonders für Event-getriebene Server-Anwendungen oder Microservices, die viele parallele HTTP-Verbindungen verwalten müssen.
Hinweis: Diese Klasse ist nicht zu verwechseln mit serverseitigem HTTP-Handling via EventHttp. EventHttpConnection agiert als Client-seitige Verbindung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $base Pflicht | EventBase | Die EventBase-Instanz, mit der diese Verbindung verknüpft wird. |
|
| $dns_base Pflicht | EventDnsBase|null | null | Optionaler asynchroner DNS-Resolver (EventDnsBase). Wird null übergeben, erfolgt die Namensauflösung synchron (blockierend). |
| $address Pflicht | string | Hostname oder IP-Adresse des Zielservers. | |
| $port Pflicht | int | Port des Zielservers, z. B. 80 für HTTP oder 443 für HTTPS. |
|
| $ctx | EventSslContext|null | null | Optionaler SSL-Kontext (EventSslContext) für verschlüsselte HTTPS-Verbindungen. |
Rückgabewert
Beispiele
Einfacher asynchroner HTTP-GET-Request
<?php
$base = new EventBase();
$dnsBase = new EventDnsBase($base, true);
$conn = new EventHttpConnection($base, $dnsBase, 'example.com', 80);
$conn->setTimeout(5);
$req = new EventHttpRequest(function (EventHttpRequest $req) use ($base) {
$buf = $req->getInputBuffer();
echo 'Statuscode: ' . $req->getResponseCode() . PHP_EOL;
echo 'Body: ' . $buf->read($buf->length) . PHP_EOL;
$base->exit();
}, $base);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, '/index.html');
$base->dispatch();
?>
Maximale Anzahl an Keepalive-Requests und Retry setzen
<?php
$base = new EventBase();
$conn = new EventHttpConnection($base, null, '127.0.0.1', 8080);
$conn->setMaxBodySize(1024 * 1024); // 1 MB
$conn->setMaxHeadersSize(8192); // 8 KB
$conn->setRetries(3); // bis zu 3 Wiederholungsversuche
$conn->setTimeout(10); // 10 Sekunden Timeout
$req = new EventHttpRequest(function (EventHttpRequest $req) use ($base) {
echo 'Antwort erhalten, Code: ' . $req->getResponseCode() . PHP_EOL;
$base->exit();
}, $base);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, '/api/status');
$base->dispatch();
?>
// Wichtig · Fallstricke
Blockierende DNS-Auflösung: Wenn für dns_base null übergeben wird, blockiert die DNS-Auflösung den gesamten Event-Loop. Für produktive, hochperformante Anwendungen sollte stets ein EventDnsBase-Objekt genutzt werden.
SSL/TLS: Für HTTPS-Verbindungen muss die Event-Erweiterung mit OpenSSL-Unterstützung kompiliert worden sein. Der EventSslContext muss korrekt konfiguriert sein, inklusive Zertifikatsprüfung – andernfalls bestehen Sicherheitslücken (Man-in-the-Middle-Angriffe).
Ressourcenverwaltung: EventHttpConnection-Objekte sollten nicht länger als nötig gehalten werden. Bei vielen parallelen Verbindungen empfiehlt sich ein Connection-Pool-Muster.