Einleitung: Warum Netzwerkprogrammierung in PHP spannend und gar nicht schwer ist
\n\nWenn du „Netzwerkprogrammierung“ hörst, denkst du vielleicht sofort an erfahrene C++-Entwickler, die mit Low-Level-Sockets hantieren, oder an Admins, die Python-Skripte fürs Netzwerk-Monitoring schreiben. Und PHP? Ist das nicht nur für „Hello, World!“ auf Webseiten gut?
\n\nWeit gefehlt! PHP ist ein mächtiges Werkzeug für die Netzwerkkommunikation. Es kann Sockets öffnen, HTTP-Anfragen senden, mit WebSockets arbeiten und sogar Webseiten scrapen. Und das alles – meistens – ohne zusätzliche Erweiterungen.
\n\nIn diesem Artikel zeige ich dir die wichtigsten Techniken der Netzwerkprogrammierung mit PHP. Du lernst, wie du einen einfachen TCP-Client schreibst, API-Abfragen automatisierst, Webseiten parst und deinen eigenen WebSocket-Chat baust. Los geht's!
\n\n1. Grundlagen von Sockets in PHP
\n\nSockets sind eine Low-Level-Methode, um Programme über ein Netzwerk kommunizieren zu lassen. In PHP erfolgt die Socket-Programmierung über die socket_*-Funktionen. Diese sind in der Standardinstallation enthalten, müssen aber manchmal in der php.ini aktiviert werden (Erweiterung sockets).
Einen TCP-Client erstellen
\n\nSchreiben wir einen einfachen Client, der sich mit einem Zeitserver (z.B. time.nist.gov) verbindet und die Antwort ausliest:
\n\n<?php\n$host = 'time.nist.gov';\n$port = 37;\n\n// Socket erstellen\n$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\nif ($socket === false) {\n echo "Socket konnte nicht erstellt werden: " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\n\n// Verbinden\n$result = socket_connect($socket, $host, $port);\nif ($result === false) {\n echo "Verbindung fehlgeschlagen: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// 4 Bytes lesen (NTP-Zeitformat)\n$bytes = socket_read($socket, 4);\nif ($bytes === false) {\n echo "Lesefehler: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// Socket schließen\nsocket_close($socket);\n\n// Binärdaten in Zahl umwandeln\n$time = unpack('N', $bytes)[1];\n// NTP-Zeit beginnt 1900, 70 Jahre abziehen (in Sekunden)\n$unix_time = $time - 2208988800;\necho "Aktuelle Zeit (UNIX): " . date('Y-m-d H:i:s', $unix_time) . "\\n";\n?>\n\nDieser Code verbindet sich mit dem Zeitserver, liest 4 Bytes (NTP-Zeit) und wandelt sie in ein lesbares Datum um. Beachte die Fehlerbehandlung – in der Netzwerkprogrammierung ist das essenziell.
\n\nEinen einfachen TCP-Server erstellen
\n\nJetzt bauen wir unseren eigenen Miniserver, der Verbindungen annimmt und mit „Hello, client!“ antwortet:
\n\n<?php\n$host = '127.0.0.1';\n$port = 8080;\n\n$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\nsocket_bind($server, $host, $port);\nsocket_listen($server, 5);\n\necho "Server läuft auf $host:$port\\n";\n\nwhile (true) {\n $client = socket_accept($server);\n if ($client === false) {\n continue;\n }\n $msg = "Hello, client!\\n";\n socket_write($client, $msg, strlen($msg));\n socket_close($client);\n}\nsocket_close($server);\n?>\n\nStarte das Skript in der Konsole (php server.php) und verbinde dich per Telnet: telnet 127.0.0.1 8080. Du siehst die Begrüßung.
Tipp: Für echte Projekte solltest du auf Bibliotheken wie ReactPHP oder Amp setzen – sie bieten Asynchronität und eine komfortable API.
2. HTTP-Anfragen mit cURL
\n\ncURL ist das Schweizer Taschenmesser für HTTP in PHP. Es kann GET, POST, Cookies, Header, Proxys und Zertifikate verwalten. Die Erweiterung curl ist normalerweise vorinstalliert.
Eine einfache GET-Anfrage
\n\n<?php\n$ch = curl_init('https://api.github.com/repos/php/php-src');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_USERAGENT, 'PHP Script');\n$response = curl_exec($ch);\n$http_code = curl_getinf