2012-05-24 10 views
6

Ich verwende die PHP ssh2 Bibliothek und einfach tun:PHP ssh2_connect() führt ein Timeout

$ssh = ssh2_connect($hostname, $port); 

Das Problem ist, ich mag ein Timeout einstellen, das heißt nach 5 Sekunden zu verbinden aufhören zu versuchen. Soweit ich das beurteilen kann, unterstützt die ssh2-Bibliothek kein Timeout beim nativen Verbinden. Wie kann ich einen Timeout-Wrapper implementieren?

+0

Haben Sie jemals herausgefunden, wie Sie das machen? – solefald

Antwort

0

Die libssh2 Bibliothek tut nicht die connect() von selbst, so dass es kein Timeout für das bereitstellen muss. libssh2 bietet jedoch Timeouts für die Funktionen es tut bieten ...

2

Ich habe mit dem gleichen Problem für eine Weile gekämpft. Tatsache ist, dass der Versuch, sich mit einem "toten" oder nicht reagierenden Server mit ssh2 zu verbinden, Ihre Anwendung so lange blockiert, wie das maximale Verbindungszeitlimit des Zielservers ist.

 

Die einfache Art und Weise im Voraus zu erkennen, ob die Instanz Ihnen Probleme verursachen wird, wenn SHH-ing in sie es (sehen, ob es in Reaktion ist) zu ping ist.

function getPing($addr) 
{ 
    //First try a direct ping 
    $exec = exec("ping -c 3 -s 64 -t 64 ".$addr); 
    $array = explode("/", end(explode("=", $exec))); 
    if(isset($pingVal[1])) 
    { 
     //There was a succesful ping response. 
     $pingVal = ceil($array[1]); 
    } 
    else 
    { 
     //A ping could not be sent, maybe the server is blocking them, we'll try a generic request. 
     $pingVal = callTarget($addr); 
    } 


    echo intval($pingVal)."ms"; 
    if($pingVal > ["threshold"]) 
    { 
     return false; 
    } 
    return true; 
} 

function callTarget($target) 
{ 
    $before = microtime(); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $target); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    if (curl_exec($ch)) 
    { 
     curl_close($ch); 
     return (microtime()-$before)*1000; 
    } 
    else 
    { 
     curl_close($ch); 
     return 9999; 
    } 
} 

Diese Methode ermöglicht es Ihnen, eine schnellere Reaktion auf den Zustand des Servers zu erhalten, so dass Sie wissen, wenn Sie im Begriff sind, Ihre Zeit ssh-ing in sie zu verschwenden.

+0

Ich fand die einfache Ping-Idee wirklich nützlich, spart 30 Sekunden Timeout, bevor meine benutzerdefinierten Ausnahmen geworfen werden. Vielen Dank! – Jimbo

1

Ich weiß, das ist ein alter Thread, aber das Problem ist immer noch da. Also, hier ist die Lösung dafür.

ssh2_connect() verwendet socket_connect(). socket_connect stützt sich auf die php.ini Konfigurationsparameter default_socket_timeout die standardmäßig auf 60 Sekunden (http://php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout)

So eingestellt, der einfachste Weg, unser Problem zu lösen, wird die INI-Einstellung zur Laufzeit auf einen Wert ändern, wie wir wollen, und als zurück auf den in der ini-Datei gesetzten Wert, so dass wir andere Teile unserer Software nicht beeinflussen. Im folgenden Beispiel ist der neue Wert auf 2 Sekunden festgelegt.

$originalConnectionTimeout = ini_get('default_socket_timeout'); 
    ini_set('default_socket_timeout', 2); 

    $connection = ssh2_connect('1.1.1.1'); 

    ini_set('default_socket_timeout', $originalConnectionTimeout); 

können Sie weitere Einzelheiten erfahren, wie ssh2 für PHP funktioniert, indem Sie den Quellcode von libssh2 Lesen (https://github.com/libssh2/libssh2).