Intereting Posts
Как исправить ошибку PHP Strict «Создание объекта по умолчанию из пустого значения»? Использование неопределенной константы Как удалить определенный параметр из URL-адреса в PHP? php picasa api показать большое изображение Найти URL-адрес и получить IP-адрес веб-сайта после перенаправления PHP Foreach If Array Last Загрузите файл с помощью ajax-вызова Поиск рекурсивно пустых папок и их рекурсивное удаление Можно ли проверить, приведет ли imagecreatefromjpeg к тому, что память исчерпала фатальную ошибку, прежде чем запускать ее? Как интегрировать WordPress с CodeIgniter? Командный сон для паузы в течение 20 секунд, если условие выполнено Обнаружение имен параметров в php-функции для короткого кода WordPress? Оптимизация запросов доктрины в Sonata Admin с помощью LeftJoin Буферизация вывода PHP содержит что-то до начала скрипта Как создать собственный твидовый тэг, который выполняет обратный вызов?

PHP ssh2_connect () Внедрить таймаут

Я использую библиотеку 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 предлагает таймауты для функций, которые он предоставляет …