Я использую библиотеку PHP ssh2
и просто делаю:
$ssh = ssh2_connect($hostname, $port);
Проблема в том, что я хочу установить тайм-аут, то есть через 5 секунд перестать пытаться подключиться. Насколько я могу судить, библиотека ssh2 не поддерживает тайм-аут для подключения. Как я могу реализовать оболочку тайм-аута?
Некоторое время я боролся с той же проблемой. Дело в том, что попытка подключиться к «мертвому» или невосприимчивому серверу с ssh2 остановит ваше приложение до тех пор, пока максимальный срок подключения целевого сервера не будет.
Легкий способ обнаружения заранее, если ваш экземпляр вызовет у вас проблемы, когда в него входите, пинговать его (см., Если он реагирует).
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; } }
Этот метод позволяет быстрее реагировать на состояние вашего сервера, поэтому вы знаете, собираетесь ли вы потратить свое время на то, чтобы потратить свое время.
Я знаю, что это старый поток, но проблема все еще существует. Итак, вот решение для этого.
ssh2_connect()
использует socket_connect()
. socket_connect
зависит от параметра конфигурации php ini default_socket_timeout
который по умолчанию устанавливается на 60 секунд ( http://php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout )
Таким образом, самый простой способ решить нашу проблему – изменить настройку ini во время выполнения на нужное нам значение, а не вернуться к значению, установленному в ini-файле, чтобы мы не использовали другие части нашего программного обеспечения. В приведенном ниже примере новые значения устанавливаются на 2 секунды.
$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);
Вы можете найти более подробную информацию о том, как работает ssh2 для php, прочитав исходный код libssh2 ( https://github.com/libssh2/libssh2 ).
библиотека libssh2 сама по себе не делает connect (), поэтому ей не нужно предоставлять тайм-аут для этого. Однако libssh2 предлагает таймауты для функций, которые он предоставляет …