Signatur
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
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";
}
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";
// 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.