W3docs

PHP-Netzwerkfunktionen verstehen

PHP-Netzwerkfunktionen ermöglichen DNS-Auflösungen, Socket-Verbindungen und IP-Adresskonvertierungen ohne externe Bibliotheken.

Netzwerkkonnektivität ist das Herzstück der meisten Webanwendungen: Hostnamen auflösen, Sockets öffnen, mit anderen Servern kommunizieren und IP-Adressen validieren. PHP enthält einen eingebauten Satz von Netzwerkfunktionen, mit denen Sie all das ohne externe Bibliotheken erledigen können. Dieses Kapitel erklärt, was diese Funktionen sind, wann Sie welche Gruppe verwenden sollten und wie Sie sie korrekt mit ausführbaren Beispielen einsetzen.

Was sind PHP-Netzwerkfunktionen?

PHP-Netzwerkfunktionen sind eingebaute Funktionen, die es Ihrem Skript ermöglichen, über ein Netzwerk zu kommunizieren. Mit ihnen können Sie:

  • Namen auflösen — einen Hostnamen wie www.example.com in eine IP-Adresse umwandeln (und zurück).
  • Verbindungen öffnen — einen TCP/UDP-Socket zu einem anderen Server erstellen und rohe Bytes austauschen.
  • Streams lesen und schreiben — eine Anfrage senden und die Antwort lesen.
  • Mit IP-Adressen arbeiten — zwischen menschenlesbaren Strings und gepackter Binärform konvertieren, sowohl für IPv4 als auch IPv6.

Da sie Teil des PHP-Kerns sind, ist kein pecl install oder Composer-Paket erforderlich — die folgenden Funktionen sind immer verfügbar.

DNS- und Host-Lookup-Funktionen

Bevor Sie sich mit einem Server verbinden können, benötigen Sie normalerweise dessen IP-Adresse. Diese Funktionen übernehmen die Namensauflösung.

FunktionWas sie tut
gethostbyname()Gibt die IPv4-Adresse für einen Hostnamen zurück.
gethostbyaddr()Gibt den Hostnamen für eine IP-Adresse zurück (Reverse-Lookup).
gethostbynamel()Gibt eine Liste aller IPv4-Adressen für einen Hostnamen zurück.
checkdnsrr()Prüft, ob DNS-Einträge (A, MX usw.) für einen Host vorhanden sind.
dns_get_record()Ruft die vollständigen DNS-Einträge für einen Host ab.

Eine häufige Kombination ist gethostbyname() zum Abrufen einer IP und checkdnsrr() zum Prüfen, ob ein Host tatsächlich DNS-Einträge hat — genau das ist es, worum es in der nachfolgenden Übungsfrage geht.

<?php

$host = "localhost";

// Resolve a hostname to its IPv4 address.
$ip = gethostbyname($host);
echo "IP for {$host}: {$ip}\n";

// Reverse lookup: IP back to a hostname.
echo "Host for {$ip}: " . gethostbyaddr($ip) . "\n";

Wenn ein Name nicht aufgelöst werden kann, gibt gethostbyname() den unveränderten Eingabe-String zurück, anstatt einen Fehler auszulösen — vergleichen Sie das Ergebnis immer mit dem Original, bevor Sie ihm vertrauen.

Socket-Verbindungsfunktionen

Wenn Sie eine rohe Verbindung zu einem anderen Server benötigen, öffnen Sie einen Stream-Socket. Die moderne, empfohlene Funktion ist stream_socket_client(); das ältere fsockopen() funktioniert noch, aber die Stream-API ist flexibler.

FunktionVerwendungszweck
stream_socket_client()Eine Client-Verbindung öffnen (empfohlen).
stream_socket_server()Auf eingehende Verbindungen lauschen (einen Server aufbauen).
pfsockopen()Einen persistenten Socket öffnen, der zwischen Anfragen erhalten bleibt.
fsockopen()Veraltete Methode zum Öffnen eines Sockets; bevorzugen Sie die Stream-Version.

Hier ist eine minimale HTTP-Anfrage, die manuell über einen Socket gesendet wird:

<?php

$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);

if (!$fp) {
    echo "Connection failed: {$errstr} ({$errno})\n";
} else {
    $request  = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "Connection: Close\r\n\r\n";

    fwrite($fp, $request);

    while (!feof($fp)) {
        echo fgets($fp, 128); // read the response line by line
    }
    fclose($fp);
}

Dies öffnet eine TCP-Verbindung zu Port 80, sendet eine rohe GET-Anfrage und gibt die Antwort des Servers aus. Für reale HTTP-Arbeit schreiben Sie Anfragen selten von Hand — siehe file_get_contents() für einfache Lesevorgänge oder verwenden Sie cURL / Guzzle für Header, Weiterleitungen und HTTPS.

Stream-I/O-Funktionen

Sobald ein Socket (oder ein beliebiger Stream) geöffnet ist, lesen und schreiben diese Funktionen die darüber fließenden Bytes. Es sind dieselben Funktionen, die für die Dateiverarbeitung verwendet werden, da PHP Sockets und Dateien als Streams behandelt.

  • fgets() — eine Zeile lesen.
  • fgetc() — ein Zeichen lesen.
  • fread() — eine feste Anzahl von Bytes lesen.
  • fwrite() — Daten in den Stream schreiben.
  • feof() — prüfen, ob das Ende des Streams erreicht wurde.

IP-Adress-Konvertierungsfunktionen

Diese Funktionen konvertieren zwischen der Punkt- oder Doppelpunkt-String-Form einer IP und ihrer gepackten Binärdarstellung. Sie sind unverzichtbar, wenn Adressen kompakt gespeichert oder verglichen werden sollen.

FunktionRichtungFamilie
inet_pton()String → gepacktes BinärIPv4 und IPv6
inet_ntop()gepacktes Binär → StringIPv4 und IPv6
ip2long()IPv4-String → Integernur IPv4
long2ip()Integer → IPv4-Stringnur IPv4
<?php

$ip = "192.168.1.1";

// Pack the IPv4 string into binary, then expand it back.
$packed = inet_pton($ip);
echo "Round-trip: " . inet_ntop($packed) . "\n";

// ip2long stores an IPv4 address as a single integer (handy for databases).
$long = ip2long($ip);
echo "As integer: {$long}\n";
echo "Back to string: " . long2ip($long) . "\n";

inet_pton() / inet_ntop() funktionieren sowohl für IPv4 als auch IPv6, während ip2long() / long2ip() nur für IPv4 geeignet sind. Bevorzugen Sie das inet_*-Paar, wenn Ihr Code IPv6 unterstützen muss.

IP-Adressen validieren

Um zu prüfen, ob ein String eine gültige IP ist — zum Beispiel eine Benutzereingabe — verwenden Sie filter_var() statt eines selbst geschriebenen Regex:

<?php

$candidates = ["192.168.0.1", "999.1.1.1", "::1"];

foreach ($candidates as $value) {
    $valid = filter_var($value, FILTER_VALIDATE_IP) !== false;
    echo $value . " => " . ($valid ? "valid" : "invalid") . "\n";
}

Dies validiert IPv4 und IPv6 in einem Aufruf; fügen Sie FILTER_FLAG_IPV4 oder FILTER_FLAG_IPV6 hinzu, um die Familie einzuschränken.

Wann sollten Sie diese Funktionen verwenden?

  • Low-Level-Protokolle — Aufbau eines SMTP-, FTP- oder benutzerdefinierten TCP-Clients, bei dem Sie die Bytes auf der Leitung kontrollieren.
  • Service-Health-Checks — Überprüfen, ob ein Host auflösbar ist (checkdnsrr()) oder ein Port erreichbar ist (stream_socket_client() mit kurzem Timeout).
  • Speichern von IP-Daten — Adressen mit inet_pton() oder ip2long() packen, um Speicher zu sparen und Bereichsabfragen zu ermöglichen.
  • Für gewöhnliche HTTP-API-Aufrufe bevorzugen Sie cURL oder eine Client-Bibliothek; die Socket-Funktionen sind für den Fall gedacht, dass Sie eine feinere Kontrolle benötigen, als diese bieten.

Fazit

PHPs Netzwerkfunktionen bieten alles von DNS-Lookups über rohe Sockets bis hin zur IP-Konvertierung, alles ohne externe Abhängigkeiten. Merken Sie sich die drei Gruppen: Auflösen eines Hosts (gethostbyname(), checkdnsrr()), Verbinden mit ihm (stream_socket_client()) und Lesen/Schreiben des Streams (fgets(), fwrite()). Für übergeordnete Aufgaben setzen Sie auf cURL und Guzzle und greifen nur dann auf diese Funktionen zurück, wenn Sie eine tiefergehende Kontrolle benötigen.

Übungen

Übung
Welche Funktionen werden in PHP zum Abrufen einer Netzwerk-IP und zum Prüfen einer Netzwerk-IP verwendet?
Welche Funktionen werden in PHP zum Abrufen einer Netzwerk-IP und zum Prüfen einer Netzwerk-IP verwendet?
Was this page helpful?