Introduction : pourquoi la programmation réseau en PHP est accessible et passionnante
\n\nQuand on entend « programmation réseau », on imagine souvent des développeurs C++ chevronnés manipulant des sockets bas niveau, ou des administrateurs écrivant des scripts Python pour surveiller le réseau. Et PHP ? N'est-il pas simplement destiné à afficher « Hello, World! » sur un site ?
\n\nEn réalité, PHP est un outil puissant pour les communications réseau. Il sait ouvrir des sockets, effectuer des requêtes HTTP, travailler avec WebSocket et même scraper d'autres sites. Et tout cela, sans avoir à installer d'extensions supplémentaires (enfin, presque).
\n\nDans cet article, nous allons explorer les techniques clés de la programmation réseau en PHP. Vous apprendrez à créer un client TCP simple, à automatiser des requêtes API, à scraper des sites web et à développer votre propre chat avec WebSocket. C'est parti !
\n\n1. Les bases des sockets en PHP
\n\nLes sockets sont un moyen bas niveau de communication entre programmes via le réseau. En PHP, la gestion des sockets se fait via les fonctions de la famille socket_*. Elles sont incluses dans la distribution standard, mais nécessitent parfois l'activation de l'extension sockets dans le fichier php.ini.
Création d'un client TCP
\n\nÉcrivons un client simple qui se connecte à un serveur (par exemple, time.nist.gov — le serveur de temps officiel) et lit la réponse :
\n\n<?php\n$host = 'time.nist.gov';\n$port = 37;\n\n// Création du socket\n$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\nif ($socket === false) {\n echo "Impossible de créer le socket : " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\n\n// Connexion\n$result = socket_connect($socket, $host, $port);\nif ($result === false) {\n echo "Échec de la connexion : " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// Lecture de 4 octets (temps au format NTP)\n$bytes = socket_read($socket, 4);\nif ($bytes === false) {\n echo "Erreur de lecture : " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// Fermeture du socket\nsocket_close($socket);\n\n// Conversion des données binaires en nombre\n$time = unpack('N', $bytes)[1];\n// Le temps NTP commence en 1900, on soustrait 70 ans (en secondes)\n$unix_time = $time - 2208988800;\necho "Heure actuelle (UNIX) : " . date('Y-m-d H:i:s', $unix_time) . "\\n";\n?>\n\nCe code se connecte au serveur de temps, lit 4 octets (l'heure au format NTP) et les convertit en une date lisible. Notez la gestion des erreurs — essentielle en programmation réseau.
\n\nCréation d'un serveur TCP simple
\n\nMaintenant, créons notre propre mini-serveur qui accepte les connexions et répond « Bonjour, client ! » :
\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 "Serveur démarré sur $host:$port\\n";\n\nwhile (true) {\n $client = socket_accept($server);\n if ($client === false) {\n continue;\n }\n $msg = "Bonjour, client !\\n";\n socket_write($client, $msg, strlen($msg));\n socket_close($client);\n}\nsocket_close($server);\n?>\n\nLancez le script dans un terminal (php server.php), puis connectez-vous via telnet : telnet 127.0.0.1 8080. Vous verrez le message de bienvenue.
Astuce : Pour des projets réels, utilisez des bibliothèques comme ReactPHP ou Amp — elles offrent l'asynchronisme et une API pratique.
2. Requêtes HTTP avec cURL
\n\ncURL est le couteau suisse pour les requêtes HTTP en PHP. Il permet de faire des GET, POST, de gérer les cookies, les en-têtes, les proxies et les certificats. L'extension curl est généralement préinstallée.
Requête GET basique
\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