2012-05-24 21 views
6

używam PHP ssh2 biblioteki i po prostu robi:PHP ssh2_connect() Wdrożenie timeout

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

Problemem jest to, chcę ustawić limit czasu, czyli po upływie 5 sekund przestać próbować się połączyć. O ile mogę powiedzieć, że biblioteka ssh2 nie obsługuje timeoutu na połączeniu natywnie. Jak mogę zaimplementować opakowanie czasu oczekiwania?

+0

Czy kiedykolwiek zastanawiałeś się, jak to zrobić? – solefald

Odpowiedz

0

Biblioteka nie wykonuje samodzielnie funkcji connect(), więc nie musi podawać dla niej limitu czasu. libssh2 oferuje jednak limity czasowe dla funkcji, które ma dostarczać ...

2

Przez pewien czas zmagałem się z tym samym problemem. Faktem jest, że próba połączenia się z "martwym" lub niereagującym serwerem za pomocą ssh2 spowoduje zatrzymanie aplikacji tak długo, jak maksymalny limit czasu połączenia serwera docelowego.

 

Łatwy sposób wykryć wcześniej, jeśli instancja ma zamiar spowodować problemy podczas cii-ing na to, żeby go ping (sprawdzić, czy jest czuły).

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; 
    } 
} 

Ta metoda pozwala uzyskać szybszą reakcję na stan serwera, więc wiesz, jeśli masz zamiar tracić czasu ssh-ing do niego.

+0

Znalazłem prosty pomysł Ping naprawdę przydatne, oszczędza 30 sekund timeout przed wyrzuceniem moich niestandardowych wyjątków. Dzięki! – Jimbo

1

Wiem, że to stary wątek, ale problem nadal istnieje. Oto rozwiązanie.

ssh2_connect() używa socket_connect(). socket_connect opiera się na parametrze konfiguracyjnym php ini default_socket_timeout, który jest ustawiony domyślnie na 60 sekund (http://php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout)

Tak, najprostszy sposób na rozwiązanie naszego problemu jest zmiana ini ustawienie na starcie do wartości chcemy, a nie wstecz do wartości ustawionej w pliku ini, więc unikamy wykonywania innych części naszego oprogramowania. W poniższym przykładzie nowe wartości ustawiono na 2 sekundy.

$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); 

można znaleźć dodatkowe informacje o jak SSH2 dla PHP działa poprzez odczytanie kodu źródłowego libssh2 (https://github.com/libssh2/libssh2).