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.comin 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.
| Funktion | Was 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.
| Funktion | Verwendungszweck |
|---|---|
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.
| Funktion | Richtung | Familie |
|---|---|---|
inet_pton() | String → gepacktes Binär | IPv4 und IPv6 |
inet_ntop() | gepacktes Binär → String | IPv4 und IPv6 |
ip2long() | IPv4-String → Integer | nur IPv4 |
long2ip() | Integer → IPv4-String | nur 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ährendip2long()/long2ip()nur für IPv4 geeignet sind. Bevorzugen Sie dasinet_*-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()oderip2long()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.