Start · Sprachen · PHP · Referenz · swoole_async_dns_lookup

swoole_async_dns_lookup

Funktion

Löst einen Hostnamen asynchron und nicht blockierend in eine IP-Adresse auf und ruft nach Abschluss den angegebenen Callback auf.

Kategorie: misc

Signatur

swoole_async_dns_lookup(string $hostname, callable $callback): bool

Beschreibung

swoole_async_dns_lookup gehört zur Swoole-Erweiterung für PHP und ermöglicht die nicht blockierende DNS-Auflösung. Anstatt den aktuellen Prozess oder Thread während der DNS-Anfrage anzuhalten (wie es gethostbyname tut), wird die Auflösung im Hintergrund durchgeführt. Sobald das Ergebnis vorliegt, wird die übergebene Callback-Funktion aufgerufen.

Diese Funktion ist besonders in Swoole-basierten Server-Anwendungen und asynchronen Event-Loop-Kontexten sinnvoll, wo blockierende I/O-Operationen den Durchsatz drastisch reduzieren würden. In einer synchronen PHP-Umgebung ohne Swooles Event-Loop ist der Nutzen hingegen begrenzt.

Der Callback erhält als Parameter den ursprünglichen Hostnamen sowie die aufgelöste IP-Adresse. Wenn die Auflösung fehlschlägt, wird die IP-Adresse als leerer String oder false übergeben. Es empfiehlt sich daher, im Callback stets auf Fehler zu prüfen.

Hinweis: Diese Funktion ist als veraltet (deprecated) zu betrachten. In neueren Swoole-Versionen sollte stattdessen die coroutine-basierte DNS-Auflösung über Swoole\Coroutine\System::gethostbyname() verwendet werden.

Parameter

Name Typ Default Beschreibung
$hostname Pflicht string Der aufzulösende Hostname, z. B. 'www.example.com'.
$callback Pflicht callable Eine Callback-Funktion, die nach abgeschlossener DNS-Auflösung aufgerufen wird. Sie erhält zwei Parameter: string $hostname (der ursprüngliche Hostname) und string $ip (die aufgelöste IP-Adresse oder einen leeren String bei Fehler).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die asynchrone Anfrage erfolgreich eingeleitet wurde, andernfalls false.

Beispiele

Einfache asynchrone DNS-Auflösung

<?php
// Setzt eine laufende Swoole-Umgebung voraus
swoole_async_dns_lookup('www.example.com', function (string $hostname, string $ip) {
    if (empty($ip)) {
        echo "DNS-Auflösung für {$hostname} fehlgeschlagen.\n";
    } else {
        echo "Hostname: {$hostname} => IP: {$ip}\n";
    }
});

// Der Event-Loop von Swoole läuft weiter und verarbeitet andere Ereignisse,
// bis der Callback aufgerufen wird.
Hostname: www.example.com => IP: 93.184.216.34

Verwendung in einem Swoole-HTTP-Server

<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);

$server->on('request', function ($request, $response) {
    $host = $request->get['host'] ?? 'www.example.com';

    swoole_async_dns_lookup($host, function (string $hostname, string $ip) use ($response) {
        if (empty($ip)) {
            $response->status(500);
            $response->end("DNS-Auflösung fehlgeschlagen für: {$hostname}");
        } else {
            $response->end("IP-Adresse von {$hostname}: {$ip}");
        }
    });
});

$server->start();

// Wichtig · Fallstricke

Deprecation: swoole_async_dns_lookup gilt in neueren Swoole-Versionen als veraltet. Es wird empfohlen, stattdessen Swoole\Coroutine\System::gethostbyname() innerhalb einer Coroutine zu verwenden, da dieser Ansatz moderner, wartbarer und besser in das Coroutine-Modell von Swoole integriert ist.

Nur im Event-Loop: Diese Funktion arbeitet nur korrekt innerhalb des Swoole-Event-Loops. Ein Aufruf außerhalb eines Swoole-Servers oder -Clients führt möglicherweise dazu, dass der Callback nie ausgeführt wird.

Sicherheit: Nutzereingaben, die als $hostname übergeben werden, sollten vor der Übergabe validiert werden, um unerwartetes Verhalten oder DNS-Rebinding-Angriffe zu vermeiden.