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.
Czy kiedykolwiek zastanawiałeś się, jak to zrobić? – solefald