私はPHPssh2
ライブラリを使用しており、単純に次のことを行っています:
$ssh = ssh2_connect($hostname, $port);
問題は、タイムアウトを設定することです。つまり、5 秒後に接続の試行を停止します。私が知る限り、ssh2 ライブラリは接続時のタイムアウトをネイティブにサポートしていません。タイムアウト ラッパーを実装するにはどうすればよいですか?
私はしばらく同じ問題に苦しんできました。実際には、ssh2 を使用して「デッド」または応答しないサーバーに接続しようとすると、ターゲット サーバーの最大接続時間制限の間、アプリケーションが停止します。
インスタンスにshするときに問題が発生するかどうかを事前に検出する簡単な方法は、インスタンスにpingを実行することです(応答するかどうかを確認します)。
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;
}
}
この方法を使用すると、サーバーの状態についてより迅速に応答できるため、サーバーに ssh 接続して時間を無駄にしようとしているかどうかがわかります。
libssh2ライブラリはそれ自体で connect() を実行しないため、タイムアウトを提供する必要はありません。ただし、libssh2 は提供する機能のタイムアウトを提供します...