Signatur
Beschreibung
socket_create() erzeugt einen neuen Socket, der als Endpunkt für die Netzwerkkommunikation dient. Ein Socket ist vergleichbar mit einem Datei-Handle, über das Daten gesendet und empfangen werden können – sowohl über TCP/IP als auch über UDP oder Unix-Domain-Sockets.
Der Parameter $domain legt das Kommunikationsprotokoll fest (z. B. IPv4 mit AF_INET, IPv6 mit AF_INET6 oder lokale Unix-Sockets mit AF_UNIX). Der Parameter $type bestimmt den Verbindungstyp: SOCK_STREAM steht für verbindungsorientierte, zuverlässige Byteströme (TCP), während SOCK_DGRAM für verbindungslose Datagramme (UDP) steht.
Der erzeugte Socket muss anschließend je nach Einsatzzweck mit Funktionen wie socket_bind(), socket_listen(), socket_accept() (Server) oder socket_connect() (Client) weiterverwendet werden. Ab PHP 8.0 wird statt einer Ressource ein Socket-Objekt zurückgegeben.
Die Funktion ist besonders nützlich für Low-Level-Netzwerkanwendungen, bei denen mehr Kontrolle als mit höherstufigen Abstraktionen wie Streams (stream_socket_client()) benötigt wird – etwa für eigene Protokoll-Implementierungen oder spezielle Server-Architekturen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $domain Pflicht | int | Gibt die Protokollfamilie an. Typische Werte: AF_INET (IPv4), AF_INET6 (IPv6), AF_UNIX (lokale Unix-Domain-Sockets). |
|
| $type Pflicht | int | Legt den Socket-Typ fest. SOCK_STREAM für verbindungsorientierte Kommunikation (TCP), SOCK_DGRAM für verbindungslose Kommunikation (UDP), SOCK_RAW für Raw-Sockets. |
|
| $protocol Pflicht | int | Das zu verwendende Protokoll innerhalb der angegebenen Domain. Typische Werte: SOL_TCP (6) für TCP, SOL_UDP (17) für UDP. Bei AF_UNIX wird 0 übergeben. |
Rückgabewert
Socket-Objekt (ab PHP 8.0) bzw. eine Socket-Ressource (PHP 7.x und früher) zurück. Im Fehlerfall wird false zurückgegeben. Der Fehlercode kann mit socket_last_error() abgerufen werden.Beispiele
Einfacher TCP-Client-Socket (IPv4)
<?php
// TCP-Socket für IPv4 erstellen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
$errorCode = socket_last_error();
$errorMsg = socket_strerror($errorCode);
die("Socket konnte nicht erstellt werden: [$errorCode] $errorMsg");
}
// Mit einem HTTP-Server verbinden
$result = socket_connect($socket, 'example.com', 80);
if ($result === false) {
die('Verbindung fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}
// HTTP-Anfrage senden
$request = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Antwort lesen
$response = '';
while ($chunk = socket_read($socket, 2048)) {
$response .= $chunk;
}
echo substr($response, 0, 200) . "\n";
socket_close($socket);
Einfacher TCP-Server-Socket
<?php
// Server-Socket erstellen
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die('Socket-Erstellung fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// Adresse und Port binden
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, '127.0.0.1', 8080);
socket_listen($server, 5);
echo "Server lauscht auf 127.0.0.1:8080 ...\n";
// Eingehende Verbindung annehmen
$client = socket_accept($server);
if ($client !== false) {
$message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHallo Welt!";
socket_write($client, $message, strlen($message));
socket_close($client);
echo "Verbindung bedient und geschlossen.\n";
}
socket_close($server);
UDP-Socket erstellen und Datagramm senden
<?php
// UDP-Socket für IPv4 erstellen
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die('Fehler: ' . socket_strerror(socket_last_error()));
}
$message = 'Ping';
$bytesSent = socket_sendto($socket, $message, strlen($message), 0, '127.0.0.1', 9999);
echo "Gesendete Bytes: $bytesSent\n";
socket_close($socket);
// Wichtig · Fallstricke
Erweiterung erforderlich: Die Socket-Funktionen erfordern, dass PHP mit der sockets-Erweiterung kompiliert wurde (--enable-sockets). Auf einigen Systemen muss diese Erweiterung explizit aktiviert werden.
Raw Sockets: Die Verwendung von SOCK_RAW erfordert in der Regel Root-Rechte bzw. Administrator-Rechte. Ohne entsprechende Berechtigungen schlägt socket_create() fehl.
Ressource vs. Objekt: Ab PHP 8.0 gibt die Funktion ein Socket-Objekt zurück, in PHP 7.x und früher eine Ressource. Code, der auf den Typ prüft, muss entsprechend angepasst werden.
Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Der genaue Fehler kann mit socket_last_error() und socket_strerror() ermittelt werden. Es empfiehlt sich immer, den Rückgabewert zu prüfen.