Start · Sprachen · PHP · Referenz · socket_addrinfo_lookup

socket_addrinfo_lookup

Funktion

Führt eine <code>getaddrinfo</code>-Abfrage durch und gibt ein Array von <code>AddressInfo</code>-Ressourcen (bzw. -Objekten) für den angegebenen Hostnamen zurück.

seit PHP 7.2.0 Kategorie: http

Signatur

socket_addrinfo_lookup(string $host, ?string $service = null, array $hints = []): array|false

Beschreibung

socket_addrinfo_lookup() ist der PHP-Wrapper für die systemnahe getaddrinfo()-Funktion. Sie löst einen Hostnamen (und optional einen Dienstnamen oder Port) in eine Liste von Adressstrukturen auf, die sowohl IPv4- als auch IPv6-Adressen enthalten können. Das Ergebnis ist ein Array von opaken AddressInfo-Ressourcen (ab PHP 8.0 AddressInfo-Objekte), die anschließend mit socket_addrinfo_connect(), socket_addrinfo_bind() oder socket_addrinfo_explain() weiterverarbeitet werden können.

Der optionale Parameter $service akzeptiert entweder einen numerischen Port (z. B. '80') oder einen Dienstnamen wie 'http' oder 'ftp'. Über den $hints-Parameter lässt sich die Abfrage einschränken, etwa auf eine bestimmte Protokollfamilie (AF_INET, AF_INET6), einen Socket-Typ (SOCK_STREAM) oder ein Protokoll (SOL_TCP).

Die Funktion eignet sich besonders dann, wenn eine protokollunabhängige Namensauflösung benötigt wird — also wenn sowohl IPv4 als auch IPv6 transparent unterstützt werden sollen, ohne den Adresstyp hart zu kodieren. Im Gegensatz zu gethostbyname() liefert sie direkt verwendbare Socket-Adressinformationen inklusive Socket-Typ und Protokoll.

Nach der Verwendung sollten die zurückgegebenen AddressInfo-Ressourcen nicht manuell freigegeben werden; PHP verwaltet deren Lebenszyklus automatisch.

Parameter

Name Typ Default Beschreibung
$host Pflicht string Der Hostname oder die IP-Adresse, der aufgelöst werden soll, z. B. 'example.com' oder '::1'.
$service ?string null Optionaler Dienstname oder Port als Zeichenkette, z. B. 'http', '443' oder 'ftp'. Wird null übergeben, wird kein Dienst berücksichtigt.
$hints array [] Assoziatives Array zur Einschränkung der Suchergebnisse. Gültige Schlüssel sind ai_flags, ai_family (z. B. AF_INET6), ai_socktype (z. B. SOCK_STREAM) und ai_protocol (z. B. SOL_TCP).

Rückgabewert

Typ
array|false
Beschreibung
Gibt bei Erfolg ein Array von AddressInfo-Ressourcen/Objekten zurück. Jedes Element repräsentiert eine mögliche Adresse für den angegebenen Host und Dienst. Im Fehlerfall (z. B. bei einem nicht auflösbaren Hostnamen) wird false zurückgegeben.

Beispiele

Einfache Namensauflösung mit IPv4 und IPv6

<?php
// Alle Adressinformationen für 'example.com' auf Port 80 abrufen
$addrinfos = socket_addrinfo_lookup('example.com', '80', [
    'ai_socktype' => SOCK_STREAM,
]);

if ($addrinfos === false) {
    echo "Namensauflösung fehlgeschlagen.\n";
    exit(1);
}

foreach ($addrinfos as $addrinfo) {
    $info = socket_addrinfo_explain($addrinfo);
    echo "Familie: " . $info['ai_family'] . "\n";
    echo "Adresse: " . $info['ai_addr']['address'] . "\n";
    echo "Port:    " . $info['ai_addr']['port'] . "\n";
    echo "---\n";
}
Familie: 2 Adresse: 93.184.216.34 Port: 80 ---

Verbindung über socket_addrinfo_connect herstellen

<?php
// Nur IPv4-Adressen anfordern und direkt verbinden
$addrinfos = socket_addrinfo_lookup('example.com', 'http', [
    'ai_family'   => AF_INET,
    'ai_socktype' => SOCK_STREAM,
    'ai_protocol' => SOL_TCP,
]);

if (empty($addrinfos)) {
    echo "Keine Adresse gefunden.\n";
    exit(1);
}

// Den ersten Treffer für eine Verbindung verwenden
$socket = socket_addrinfo_connect($addrinfos[0]);

if ($socket === false) {
    echo "Verbindung fehlgeschlagen: " . socket_strerror(socket_last_error()) . "\n";
    exit(1);
}

echo "Verbindung erfolgreich hergestellt!\n";

$request = "GET / HTTP/1.0\r\nHost: example.com\r\nConnection: close\r\n\r\n";
socket_write($socket, $request);

$response = '';
while ($chunk = socket_read($socket, 2048)) {
    $response .= $chunk;
}

socket_close($socket);
echo substr($response, 0, 200) . "\n";
Verbindung erfolgreich hergestellt! HTTP/1.0 200 OK ...

// Wichtig · Fallstricke

Verfügbarkeit: Die Funktion setzt voraus, dass PHP mit der Socket-Erweiterung kompiliert wurde (--enable-sockets). Auf manchen Systemen muss zusätzlich die libc-Funktion getaddrinfo verfügbar sein.

Ressourcen vs. Objekte: Ab PHP 8.0 werden die zurückgegebenen Elemente als AddressInfo-Objekte repräsentiert, in PHP 7.x als Ressourcen. Code, der auf den Typ prüft, muss dies berücksichtigen.

Fehlerbehandlung: Bei ungültigen oder nicht auflösbaren Hostnamen gibt die Funktion false zurück. Es empfiehlt sich, dies explizit mit === false zu prüfen, da ein leeres Array ([]) ebenfalls möglich ist, wenn der Hostname bekannt, aber keine passende Adresse gemäß den Hints vorhanden ist.