Start · Sprachen · PHP · Referenz · EventDnsBase

EventDnsBase

Klasse

Repräsentiert eine asynchrone DNS-Resolver-Basis für die Event-Erweiterung und ermöglicht nicht-blockierende Hostnamen-Auflösungen.

Kategorie: io

Signatur

class EventDnsBase

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 EventBase und EventHttpConnection genutzt.
  • 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;
?>
DNS-Basis konfiguriert.

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