Start · Sprachen · PHP · Referenz · socket_set_option

socket_set_option

Funktion

Setzt eine Option auf einem Socket-Objekt, z. B. Timeout, Puffergröße oder Wiederverwendung von Adressen.

seit PHP 4.3.0 Kategorie: http

Signatur

socket_set_option(Socket $socket, int $level, int $optname, array|int $optval): bool

Beschreibung

socket_set_option() ermöglicht das Konfigurieren von Low-Level-Optionen eines Sockets. Die Optionen werden auf einer bestimmten Protokollebene ($level) gesetzt, z. B. auf Socket-Ebene (SOL_SOCKET), TCP-Ebene (SOL_TCP bzw. IPPROTO_TCP) oder IPv4/IPv6-Ebene.

Typische Anwendungsfälle sind das Aktivieren der Adress-Wiederverwendung (SO_REUSEADDR), das Setzen von Sende-/Empfangstimeouts (SO_SNDTIMEO, SO_RCVTIMEO), das Ändern der Puffergrößen (SO_SNDBUF, SO_RCVBUF) oder das Aktivieren des Keepalive-Mechanismus (SO_KEEPALIVE).

Der Parameter $optval ist entweder ein int (für einfache Boolean-/Integer-Optionen) oder ein assoziatives array mit den Schlüsseln sec und usec für Timeout-Optionen wie SO_RCVTIMEO und SO_SNDTIMEO.

Die Funktion arbeitet direkt mit dem Betriebssystem-Socket zusammen und ist daher plattformabhängig. Nicht alle Optionen sind unter Windows und Unix gleich verfügbar. Eine Übersicht über gültige Konstantenkombinationen findet sich in der PHP-Dokumentation unter socket_get_option().

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Ein gültiges Socket-Objekt, das z. B. mit socket_create() erzeugt wurde.
$level Pflicht int Die Protokollebene, auf der die Option gilt. Typische Werte: SOL_SOCKET für allgemeine Socket-Optionen, SOL_TCP / IPPROTO_TCP für TCP-spezifische Optionen.
$optname Pflicht int Die zu setzende Option, z. B. SO_REUSEADDR, SO_KEEPALIVE, SO_RCVTIMEO, SO_SNDBUF usw.
$optval Pflicht array|int Der Wert der Option. Bei einfachen Optionen ein int (z. B. 1 für aktiviert, 0 für deaktiviert). Bei Timeout-Optionen ein Array mit den Schlüsseln 'sec' (Sekunden) und 'usec' (Mikrosekunden).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Option erfolgreich gesetzt wurde. Im Fehlerfall wird false zurückgegeben und der Fehler kann mit socket_last_error() und socket_strerror() abgefragt werden.

Beispiele

SO_REUSEADDR aktivieren, um Port sofort nach Neustart wiedernutzen zu können

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Adress-Wiederverwendung aktivieren (verhindert "Address already in use"-Fehler beim Neustart)
$result = socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
if ($result === false) {
    die('socket_set_option() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
echo "Server lauscht auf Port 8080 ...\n";

socket_close($socket);
Server lauscht auf Port 8080 ...

Empfangs-Timeout mit SO_RCVTIMEO setzen

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Timeout für socket_recv() auf 5 Sekunden und 0 Mikrosekunden setzen
$timeout = ['sec' => 5, 'usec' => 0];
$result = socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
if ($result === false) {
    die('Timeout konnte nicht gesetzt werden: ' . socket_strerror(socket_last_error($socket)));
}

echo "Empfangs-Timeout erfolgreich auf 5 Sekunden gesetzt.\n";

// Gesetzten Wert zur Kontrolle auslesen
$val = socket_get_option($socket, SOL_SOCKET, SO_RCVTIMEO);
echo "Aktueller Timeout: {$val['sec']}s {$val['usec']}µs\n";

socket_close($socket);
Empfangs-Timeout erfolgreich auf 5 Sekunden gesetzt. Aktueller Timeout: 5s 0µs

TCP_NODELAY aktivieren (Nagle-Algorithmus deaktivieren)

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Nagle-Algorithmus deaktivieren für latenzarme Kommunikation
$result = socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
if ($result === false) {
    echo 'TCP_NODELAY konnte nicht gesetzt werden: ' . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "TCP_NODELAY erfolgreich aktiviert.\n";
}

socket_close($socket);
TCP_NODELAY erfolgreich aktiviert.

// Wichtig · Fallstricke

Plattformabhängigkeit: Nicht alle Optionen sind auf allen Betriebssystemen verfügbar. Besonders unter Windows fehlen einige Unix-spezifische Optionen wie SO_REUSEPORT. Testen Sie Ihr Programm auf der Zielplattform.

Reihenfolge beachten: Bestimmte Optionen wie SO_REUSEADDR müssen vor dem Aufruf von socket_bind() gesetzt werden, damit sie wirksam sind.

Seit PHP 8.0: Der erste Parameter ist vom Typ Socket (ein Objekt) statt einer resource. Code, der auf den alten Resource-Typ prüft (z. B. is_resource()), muss angepasst werden.

Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Den genauen Fehlercode erhält man mit socket_last_error($socket), den lesbaren Text mit socket_strerror().