Netzwerkprogrammierung in PHP: von Sockets bis WebSockets
\n\nWenn wir über PHP sprechen, denken wir zuerst an Webentwicklung: Formularverarbeitung, HTML-Generierung, Datenbankarbeit. Aber PHP kann viel mehr. Haben Sie sich jemals gefragt, dass Ihr PHP-Skript nicht nur ein „Antworter“ auf HTTP-Anfragen sein kann, sondern ein vollwertiger Server, der direkt mit anderen Programmen über Sockets kommuniziert? Das öffnet die Tür zu Chat-Servern, Spiele-Lobbys, Überwachungssystemen und IoT-Geräten.
\n\nIn diesem Artikel nehmen wir die rosarote Brille ab und analysieren die Netzwerkprogrammierung in PHP anhand realer Beispiele. Sie erfahren, was Sockets sind, wie Sie PHP einen Port abhören lassen, wie Sie Daten über TCP und UDP senden und empfangen, und sogar die Magie von WebSockets berühren. Los geht's!
\n\nWas ist ein Socket und wozu braucht PHP ihn?
\n\nEin Socket ist eine programmiersprachliche Schnittstelle für den Datenaustausch zwischen Prozessen, die sowohl auf demselben Rechner als auch auf verschiedenen Computern im Netzwerk laufen können. Stellen Sie sich einen Telefonhörer vor: Sie haben eine Nummer (IP-Adresse) und einen Port (Durchwahl). Sie heben den Hörer ab (erstellen einen Socket), wählen die Nummer (verbinden sich) und sprechen (übertragen Daten).
\n\nIn PHP werden Sockets über die Erweiterung sockets implementiert. Normalerweise ist sie standardmäßig deaktiviert, aber sie lässt sich leicht aktivieren. Netzwerkprogrammierung in PHP ermöglicht die Erstellung von:
- \n
- TCP-Servern und -Clients (z. B. für Chats oder den Datenaustausch mit anderen Diensten). \n
- UDP-Anwendungen (Streaming, Überwachung, bei denen Paketverluste nicht kritisch sind). \n
- WebSocket-Servern (für Echtzeitanwendungen im Browser). \n
Der Hauptvorteil ist, dass Sie in der vertrauten PHP-Umgebung bleiben, ohne auf C, Java oder Node.js umsteigen zu müssen. Für hochlastige Systeme ist PHP natürlich nicht ideal (aufgrund der Einzelthread-Architektur), aber für Prototypen, interne Werkzeuge oder geringe Lasten ist es genau richtig.
\n\nErstellen eines TCP-Servers in PHP
\n\nBeginnen wir mit der Klassik: einem TCP-Server, der Verbindungen annimmt und eine Begrüßung sendet. Dies ist die Grundlage jeder php Socket-Anwendung.
\n\nSchritt 1: Socket erstellen
\nDie Funktion socket_create() ist der erste Schritt. Sie akzeptiert drei Parameter: die Protokollfamilie (AF_INET für IPv4), den Socket-Typ (SOCK_STREAM für TCP) und das Protokoll (0 – das System wählt aus).
<?php\n// TCP-Socket erstellen\n$socket = socket_create(AF_INET, SOCK_STREAM, 0);\nif ($socket === false) {\n echo "Fehler beim Erstellen des Sockets: " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\necho "Socket erfolgreich erstellt.\\n";\n?>\n\nSchritt 2: Binden an Adresse und Port
\nWir verwenden socket_bind(). Geben Sie die IP-Adresse (0.0.0.0 – wir hören alle Schnittstellen ab) und den Port (z. B. 8080) an.
<?php\n$address = '0.0.0.0';\n$port = 8080;\n\nif (socket_bind($socket, $address, $port) === false) {\n echo "Fehler beim Binden: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "Socket an $address:$port gebunden\\n";\n?>\n\nSchritt 3: Eingehende Verbindungen abhören
\nVersetzen Sie den Socket mit socket_listen() in den Abhörmodus. Der zweite Parameter ist die maximale Länge der Verbindungswarteschlange.
<?php\nif (socket_listen($socket, 5) === false) {\n echo "Fehler beim Abhören: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "Server gestartet, warte auf Verbindungen...\\n";\n?>\n\nSchritt 4: Client annehmen
\nDie blockierende Funktion socket_accept(). Sie wartet, bis sich jemand verbindet, und gibt einen neuen Socket für die Kommunikation mit diesem Client zurück.
<?php\nwhile (true) {\n $client = socket_accept($socket);\n if ($client === false) {\n echo "Fehler beim Annehmen der Verbindung: " . socket_strerror(socket_last_error($socket)) . "\\n";\n break;\n }\n\n echo "Neuer Client hat sich verbunden.\\n";\n\n // Ab