Start · Sprachen · PHP · Referenz · socket_set_timeout

socket_set_timeout

Funktion

Alias von <code>stream_set_timeout()</code> — setzt das Timeout für Operationen auf einem Stream.

seit PHP 4.0.0 Kategorie: http

Signatur

socket_set_timeout(resource $stream, int $seconds, int $microseconds = 0): bool

Beschreibung

socket_set_timeout() ist ein Alias der Funktion stream_set_timeout() und setzt das maximale Wartezeitraum (Timeout) für Lese- und Schreiboperationen auf einem gegebenen Stream. Das Timeout wird als Kombination aus Sekunden ($seconds) und Mikrosekunden ($microseconds) angegeben.

Typischerweise wird diese Funktion bei Netzwerk-Streams eingesetzt, zum Beispiel bei Verbindungen, die über fsockopen() oder stream_socket_client() geöffnet wurden. Läuft das Timeout ab, ohne dass die Operation abgeschlossen werden konnte, schlägt die nächste Lese-/Schreiboperation fehl und stream_get_meta_data() gibt timed_out als true zurück.

Da es sich um einen offiziellen Alias handelt, verhält sich socket_set_timeout() identisch zu stream_set_timeout(). Für neuen Code wird empfohlen, direkt stream_set_timeout() zu verwenden, da Alias-Funktionen in zukünftigen PHP-Versionen potenziell entfernt werden könnten.

Diese Funktion ist nicht für Sockets aus der socket_*()-Erweiterung (ext/sockets) gedacht. Für jene gibt es socket_set_option() mit den Optionen SO_RCVTIMEO und SO_SNDTIMEO.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Der Stream, für den das Timeout gesetzt werden soll. Typischerweise eine Ressource, die von fsockopen(), fopen() oder stream_socket_client() zurückgegeben wurde.
$seconds Pflicht int Der Sekunden-Anteil des Timeouts. Zusammen mit $microseconds ergibt sich die gesamte Wartezeit.
$microseconds int 0 Der Mikrosekunden-Anteil des Timeouts (0–999999). Wird zu $seconds addiert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn $stream keine gültige Stream-Ressource ist).

Beispiele

HTTP-Anfrage mit Timeout über fsockopen

<?php
$host = 'example.com';
$fp = fsockopen($host, 80, $errno, $errstr, 5);

if (!$fp) {
    echo "Verbindung fehlgeschlagen: $errstr ($errno)\n";
    exit;
}

// Timeout auf 3 Sekunden setzen
socket_set_timeout($fp, 3);

fputs($fp, "GET / HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n");

$response = '';
while (!feof($fp)) {
    $response .= fgets($fp, 128);
    $info = stream_get_meta_data($fp);
    if ($info['timed_out']) {
        echo "Timeout aufgetreten!\n";
        break;
    }
}

fclose($fp);
echo substr($response, 0, 200);
?>
HTTP/1.0 200 OK ...

Timeout mit Sekunden- und Mikrosekunden-Anteil

<?php
// Verbindung zu einem lokalen Service
$fp = fsockopen('127.0.0.1', 9000, $errno, $errstr, 2);

if (!$fp) {
    echo "Fehler: $errstr ($errno)\n";
    exit;
}

// Timeout auf 1,5 Sekunden setzen (1 Sekunde + 500.000 Mikrosekunden)
$result = socket_set_timeout($fp, 1, 500000);

echo $result ? "Timeout erfolgreich gesetzt." : "Fehler beim Setzen des Timeouts.";

fclose($fp);
?>
Timeout erfolgreich gesetzt.

// Wichtig · Fallstricke

Alias-Hinweis: socket_set_timeout() ist ein Alias von stream_set_timeout(). Für neuen Code sollte bevorzugt stream_set_timeout() verwendet werden.

Achtung: Diese Funktion gilt nur für Stream-Ressourcen (z. B. aus fsockopen()). Für Sockets aus der socket_*()-Erweiterung (z. B. socket_create()) muss stattdessen socket_set_option() mit SO_RCVTIMEO/SO_SNDTIMEO verwendet werden.

Das Timeout betrifft nicht die initiale Verbindungsherstellung – dafür ist der $timeout-Parameter von fsockopen() zuständig. Nach einem abgelaufenen Timeout sollte stream_get_meta_data() geprüft werden, um den genauen Grund für das Ende eines Streams zu ermitteln.