Signatur
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
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);
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);
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);
// 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().