Signatur
Beschreibung
Die Klasse Socket ist eine opake Wrapper-Klasse, die in PHP 8.0.0 eingeführt wurde, um die bis dahin verwendeten resource-Handles für Netzwerk-Sockets zu ersetzen. Sie kann nicht direkt instanziiert werden; Instanzen werden ausschließlich von Socket-Funktionen wie socket_create(), socket_accept() oder socket_import_stream() erzeugt.
Als opake Klasse besitzt sie keine öffentlich zugänglichen Eigenschaften oder Methoden – sie dient lediglich als typsicheres Handle, das an die übrigen Socket-Funktionen der ext/sockets-Erweiterung übergeben wird. Durch die Einführung dieser Klasse profitieren Entwickler von echter Typprüfung und Typ-Deklarationen (Socket statt resource) in Funktions-Signaturen und Interfaces.
Der Lebenszyklus eines Sockets bleibt unverändert: erstellen mit socket_create(), optional binden mit socket_bind(), verbinden oder lauschen, Daten senden/empfangen und schließlich mit socket_close() freigeben. Die Socket-Instanz wird dabei als erster Parameter an all diese Funktionen übergeben.
Für PHP-Versionen vor 8.0 war der Typ resource; beim Upgrade auf PHP 8.0+ genügt es in den meisten Fällen, Typ-Deklarationen von resource auf Socket zu aktualisieren, da die Socket-Funktionen selbst abwärtskompatibel bleiben.
Beispiele
Einfacher TCP-Client mit Socket-Klasse
<?php
// Voraussetzung: PHP-Erweiterung ext/sockets muss aktiv sein
// Erstellt einen TCP-Socket (IPv4)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!($socket instanceof Socket)) {
die('Fehler beim Erstellen des Sockets: ' . socket_strerror(socket_last_error()));
}
// Mit einem Server verbinden (hier: lokaler Echo-Server auf Port 7)
$result = socket_connect($socket, '127.0.0.1', 7);
if ($result === false) {
echo 'Verbindung fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)) . PHP_EOL;
} else {
$message = 'Hallo, Socket!';
socket_write($socket, $message, strlen($message));
$response = socket_read($socket, 1024);
echo 'Antwort vom Server: ' . $response . PHP_EOL;
}
socket_close($socket);
// $socket ist nun ungültig
Typsichere Funktion mit Socket als Parameter
<?php
/**
* Sendet eine Nachricht über einen bestehenden Socket.
* Durch den Socket-Typ-Hint wird resource-Übergabe verhindert.
*/
function sendMessage(Socket $socket, string $message): int|false
{
$length = strlen($message);
$sent = socket_write($socket, $message, $length);
if ($sent === false) {
trigger_error(
'Senden fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)),
E_USER_WARNING
);
return false;
}
return $sent;
}
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 7);
$bytesSent = sendMessage($socket, 'Test-Nachricht');
echo "Gesendete Bytes: {$bytesSent}" . PHP_EOL;
socket_close($socket);
// Wichtig · Fallstricke
Opake Klasse: Die Klasse Socket kann weder direkt instanziiert (new Socket()) noch durch Vererbung erweitert werden. Jeder Versuch führt zu einem fatalen Fehler.
Ressourcen-Migration: In PHP 8.0 wurden alle resource-Handles für Sockets transparent durch Socket-Objekte ersetzt. Code, der auf is_resource($socket) prüfte, sollte auf $socket instanceof Socket umgestellt werden.
Sicherheit: Socket-Kommunikation ist standardmäßig unverschlüsselt. Für sichere Verbindungen sollte stream_socket_client() mit SSL/TLS-Kontext oder die OpenSSL-Erweiterung verwendet werden. Eingehende Daten immer validieren und sanitisieren, da Netzwerkeingaben als nicht vertrauenswürdig gelten.
Fehlerbehandlung: Die meisten Socket-Funktionen geben bei Fehlern false zurück. Der genaue Fehlercode kann mit socket_last_error() und die lesbare Meldung mit socket_strerror() abgerufen werden.