Start · Sprachen · PHP · Referenz · Socket

Socket

Klasse

Vollständig opake Klasse, die ab PHP 8.0.0 die bisherigen Socket-Ressourcen ersetzt und als Rückgabewert von <code>socket_create()</code> verwendet wird.

seit PHP 8.0.0 Kategorie: http

Signatur

final class Socket

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
Antwort vom Server: Hallo, Socket!

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);
Gesendete Bytes: 14

// 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.