Signatur
Beschreibung
EventDnsBase ist Teil der Event-Erweiterung (libevent-Binding) und stellt eine asynchrone DNS-Resolver-Infrastruktur bereit. Sie liest beim Initialisieren automatisch die Systemkonfiguration aus resolv.conf (Domain- und Suchfelder) ein, um Hostnamen korrekt auflösen zu können.
Die Klasse wird benötigt, wenn asynchrone HTTP-Anfragen oder andere netzwerkbasierte Operationen innerhalb einer EventBase-Event-Loop nicht-blockierend ausgeführt werden sollen. Ohne EventDnsBase würden DNS-Lookups den gesamten Event-Loop blockieren, da sie intern synchron ablaufen würden.
Typischerweise wird eine EventDnsBase-Instanz einmalig angelegt und dann an andere asynchrone Klassen wie EventHttpConnection übergeben. Über verschiedene Methoden lassen sich Nameserver hinzufügen, Suchdomains setzen und das Resolver-Verhalten konfigurieren.
- Wird meist zusammen mit
EventBaseundEventHttpConnectiongenutzt. - Basiert auf dem evdns-Subsystem von libevent.
- Ermöglicht sowohl IPv4- als auch IPv6-Auflösungen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $base Pflicht | EventBase | Die EventBase-Instanz, mit der diese DNS-Basis verknüpft wird. Alle DNS-Auflösungen laufen innerhalb dieser Event-Loop ab. |
|
| $initialize Pflicht | bool | Wenn true, wird die Konfiguration automatisch aus resolv.conf eingelesen (Nameserver, Suchdomains). Bei false startet die Basis unkonfiguriert und muss manuell eingerichtet werden. |
Beispiele
Asynchrone DNS-Auflösung mit EventDnsBase und EventHttpConnection
<?php
// Event-Loop erstellen
$base = new EventBase();
// DNS-Basis erstellen und resolv.conf automatisch einlesen
$dns = new EventDnsBase($base, true);
// Asynchrone HTTP-Verbindung mit DNS-Basis
$conn = new EventHttpConnection($base, $dns, 'www.example.com', 80);
$req = new EventHttpRequest(function (EventHttpRequest $req) use ($base) {
$buf = $req->getInputBuffer();
echo "HTTP-Status: " . $req->getResponseCode() . PHP_EOL;
echo $buf->read($buf->length) . PHP_EOL;
$base->exit();
}, $base);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, '/');
$base->dispatch();
?>
Manuelles Hinzufügen eines Nameservers
<?php
$base = new EventBase();
// Ohne automatisches Einlesen der resolv.conf starten
$dns = new EventDnsBase($base, false);
// Eigenen Nameserver manuell hinzufügen (z. B. Google DNS)
$dns->addNameserverIp('8.8.8.8');
// Suchdomain setzen
$dns->setSearchNdots(1);
echo "DNS-Basis konfiguriert." . PHP_EOL;
?>
// Wichtig · Fallstricke
Wichtig: EventDnsBase setzt eine korrekt installierte und konfigurierte libevent-Bibliothek mit aktiviertem evdns-Support voraus. Nicht alle Systempakete kompilieren libevent mit vollem evdns-Support.
Die resolv.conf-Datei wird nur zum Zeitpunkt der Instanziierung (bei initialize = true) eingelesen. Spätere Änderungen an der Systemkonfiguration werden nicht automatisch übernommen.
Beim Einsatz in Long-Running-Prozessen (z. B. Daemons) sollte die DNS-Konfiguration manuell aktuell gehalten oder die Instanz bei Bedarf neu erstellt werden, um DNS-Cache-Probleme zu vermeiden.