Start · Sprachen · PHP · Referenz · ssh2_set_timeout

ssh2_set_timeout

Funktion

Setzt den Timeout-Wert (in Sekunden) für blockierende Lese-/Schreiboperationen einer aktiven SSH2-Sitzung.

seit PHP 1.3.0 Kategorie: http

Signatur

ssh2_set_timeout(resource $session, int $timeout): bool

Beschreibung

ssh2_set_timeout() legt fest, wie lange blockierende Operationen – beispielsweise das Lesen von einem SSH-Kanal – auf eine Antwort des Remote-Servers warten dürfen, bevor sie abgebrochen werden. Der Wert wird in Sekunden angegeben und gilt für die gesamte übergebene SSH2-Sitzung (resource).

Diese Funktion ist besonders nützlich, wenn eine SSH-Verbindung zu einem instabilen oder langsamen Remote-Host aufgebaut wird und man verhindern möchte, dass das Skript unendlich lange hängt. Durch das Setzen eines sinnvollen Timeouts können Netzwerkprobleme frühzeitig erkannt und entsprechend behandelt werden.

Die Funktion gehört zur SSH2-Erweiterung (ext/ssh2), die auf libssh2 basiert. Sie muss vor oder nach dem Verbindungsaufbau aufgerufen werden; der neue Timeout-Wert gilt sofort für alle nachfolgenden blockierenden Operationen auf dieser Sitzung.

Zu beachten ist, dass der Timeout intern an libssh2 weitergegeben wird und daher das Verhalten je nach zugrunde liegender Bibliotheksversion leicht variieren kann. Ein Timeout-Wert von 0 deaktiviert den Timeout (blockiert unbegrenzt).

Parameter

Name Typ Default Beschreibung
$session Pflicht resource Eine gültige SSH2-Sitzungsressource, wie sie von ssh2_connect() zurückgegeben wird.
$timeout Pflicht int Timeout-Wert in Sekunden. Der Wert 0 deaktiviert den Timeout (unbegrenztes Warten). Negative Werte sollten vermieden werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. ungültige Sitzungsressource).

Beispiele

Timeout für eine SSH2-Sitzung setzen

<?php
// Verbindung zum SSH-Server aufbauen
$session = ssh2_connect('example.com', 22);
if ($session === false) {
    die('Verbindung fehlgeschlagen.');
}

// Timeout auf 10 Sekunden setzen
if (!ssh2_set_timeout($session, 10)) {
    die('Timeout konnte nicht gesetzt werden.');
}

// Authentifizierung
if (!ssh2_auth_password($session, 'benutzer', 'geheimes_passwort')) {
    die('Authentifizierung fehlgeschlagen.');
}

// Kommando ausführen
$stream = ssh2_exec($session, 'ls -la /var/www');
if ($stream === false) {
    die('Befehl konnte nicht ausgeführt werden.');
}

stream_set_blocking($stream, true);
$output = stream_get_contents($stream);
fclose($stream);

echo $output;
?>

Timeout zurücksetzen (deaktivieren)

<?php
$session = ssh2_connect('example.com', 22);
if ($session === false) {
    die('Verbindung fehlgeschlagen.');
}

// Zunächst kurzen Timeout für die Authentifizierungsphase setzen
ssh2_set_timeout($session, 5);

ssh2_auth_publickey_fromfile(
    $session,
    'benutzer',
    '/home/benutzer/.ssh/id_rsa.pub',
    '/home/benutzer/.ssh/id_rsa'
);

// Nach der Authentifizierung Timeout deaktivieren (0 = unbegrenzt)
ssh2_set_timeout($session, 0);

// Langlaufendes Kommando ohne Timeout ausführen
$stream = ssh2_exec($session, 'find / -name "*.log" 2>/dev/null');
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);
fclose($stream);

echo $output;
?>

// Wichtig · Fallstricke

Verfügbarkeit: ssh2_set_timeout() erfordert die PECL-Erweiterung ssh2 ab Version 1.3.0 sowie libssh2 1.2.9 oder neuer. Ältere Versionen der Erweiterung kennen diese Funktion nicht – im Zweifel die PECL-Changelog prüfen.

Genauigkeit: Der Timeout-Wert wird intern in Millisekunden an libssh2 übergeben. Das ganzzahlige Sekunden-Argument wird dabei mit 1000 multipliziert, sodass Sub-Sekunden-Timeouts über diese Funktion nicht direkt konfigurierbar sind.

Sicherheitshinweis: Ein zu großzügiger (oder deaktivierter) Timeout kann dazu führen, dass das PHP-Skript bei einem kompromittierten oder ausgefallenen Server dauerhaft blockiert. Setzen Sie stets einen angemessenen Timeout, insbesondere in Web-Umgebungen, um Ressourcenerschöpfung zu vermeiden.