Signatur
Beschreibung
socket_get_option() liest eine Socket-Option auf einem durch socket_create() oder socket_accept() erzeugten Socket. Welche Option gelesen wird, bestimmt die Kombination aus $level (Protokollebene) und $optname (Optionsname).
Typische Anwendungsfälle sind das Abfragen von Puffergrößen (SO_SNDBUF, SO_RCVBUF), Timeout-Werten (SO_SNDTIMEO, SO_RCVTIMEO), dem Verbindungsstatus oder der Frage, ob ein Socket die Wiederverwendung einer Adresse erlaubt (SO_REUSEADDR). Dies ist insbesondere beim Debuggen von Netzwerkproblemen oder beim Tuning von Server-Applikationen nützlich.
Der Parameter $level bestimmt, auf welcher Protokollschicht die Option angesiedelt ist. Für allgemeine Socket-Optionen wird SOL_SOCKET verwendet. Für TCP-spezifische Optionen (z. B. TCP_NODELAY) wird SOL_TCP bzw. IPPROTO_TCP angegeben. Der Rückgabewert ist je nach Option ein Integer, ein Array oder ein boolescher Wert.
Das Gegenstück zum Lesen ist socket_set_option(), mit dem Socket-Optionen gesetzt werden können.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Eine gültige Socket-Instanz, die zuvor mit socket_create() oder socket_accept() erzeugt wurde. |
|
| $level Pflicht | int | Die Protokollebene, auf der die Option gilt. Häufige Werte sind SOL_SOCKET für allgemeine Socket-Optionen, SOL_TCP / IPPROTO_TCP für TCP-spezifische Optionen und IPPROTO_IP für IPv4-Optionen. |
|
| $optname Pflicht | int | Die abzufragende Option, z. B. SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF, SO_RCVTIMEO, SO_SNDTIMEO, SO_KEEPALIVE, SO_LINGER oder TCP_NODELAY. |
Rückgabewert
int, Timeout-Optionen liefern ein assoziatives Array mit den Schlüsseln sec und usec, und SO_LINGER liefert ein Array mit l_onoff und l_linger. Bei einem Fehler wird false zurückgegeben.Beispiele
Empfangspuffergröße und Adresswiederverwendung abfragen
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// Empfangspuffergröße abfragen
$rcvBuf = socket_get_option($socket, SOL_SOCKET, SO_RCVBUF);
echo 'SO_RCVBUF: ' . $rcvBuf . ' Bytes' . PHP_EOL;
// Prüfen ob SO_REUSEADDR aktiv ist
$reuseAddr = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);
echo 'SO_REUSEADDR: ' . ($reuseAddr ? 'aktiv' : 'inaktiv') . PHP_EOL;
socket_close($socket);
Sende- und Empfangs-Timeout auslesen
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// Timeout auf 5 Sekunden setzen
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 3, 'usec' => 500000]);
// Gesetzte Timeouts wieder auslesen
$rcvTimeout = socket_get_option($socket, SOL_SOCKET, SO_RCVTIMEO);
$sndTimeout = socket_get_option($socket, SOL_SOCKET, SO_SNDTIMEO);
echo 'Empfangs-Timeout: ' . $rcvTimeout['sec'] . 's ' . $rcvTimeout['usec'] . 'µs' . PHP_EOL;
echo 'Sende-Timeout: ' . $sndTimeout['sec'] . 's ' . $sndTimeout['usec'] . 'µs' . PHP_EOL;
socket_close($socket);
TCP_NODELAY (Nagle-Algorithmus) abfragen
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// TCP_NODELAY deaktiviert den Nagle-Algorithmus für geringe Latenz
socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
$noDelay = socket_get_option($socket, SOL_TCP, TCP_NODELAY);
echo 'TCP_NODELAY: ' . ($noDelay ? 'aktiviert (kein Nagle)' : 'deaktiviert') . PHP_EOL;
socket_close($socket);
// Wichtig · Fallstricke
Plattformunterschiede: Nicht alle Optionen sind auf allen Betriebssystemen verfügbar. Einige Optionen (z. B. SO_REUSEPORT) sind unter Windows nicht unterstützt. Prüfe daher stets den Rückgabewert auf false und verwende socket_last_error() zur Fehlerdiagnose.
Puffergrößen: Der vom Betriebssystem tatsächlich verwendete Puffer kann vom angeforderten Wert abweichen, weil der Kernel die Größe intern anpassen kann (z. B. verdoppeln). socket_get_option() gibt den tatsächlichen Wert zurück, nicht den angeforderten.
PHP-Version: Ab PHP 8.0 wird anstelle des Ressourcen-Typs die Klasse Socket verwendet. Älterer Code mit resource-Typ funktioniert in PHP 8+ nicht mehr direkt.