2012-05-24 22 views
6

estoy usando el ssh2 librería PHP, y simplemente haciendo:PHP ssh2_connect() Implementar un tiempo de espera

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

El problema es que quiero establecer un tiempo de espera, es decir, después de 5 segundos dejar de intentar conectar. Por lo que puedo decir, la biblioteca ssh2 no admite un tiempo de espera para conectarse de forma nativa. ¿Cómo puedo implementar un contenedor de tiempo de espera?

+0

¿alguna vez descubrió cómo hacer esto? – solefald

Respuesta

0

la biblioteca libssh2 no hace la conexión() por sí sola, por lo que no tiene que proporcionar un tiempo de espera para eso. libssh2 sin embargo ofrece tiempos de espera para las funciones que proporciona proporciona ...

2

He estado luchando con el mismo problema por un tiempo. El hecho es que si intentas conectarte a un servidor "muerto" o que no responde con ssh2, la aplicación se detendrá durante el tiempo máximo de conexión del servidor de destino.

 

La manera más fácil de detectar de antemano si la instancia va a causar problemas cuando shh-ción en él es hacer ping a ella (ver si es sensible).

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

Este método le permite obtener una respuesta más rápida sobre el estado de su servidor, para que sepa si está a punto de perder el tiempo ssh-ción en ella.

+0

Encontré que la simple idea Ping realmente útil, ahorra 30 segundos de tiempo de espera antes de lanzar mis excepciones personalizadas. ¡Gracias! – Jimbo

1

Sé que este es un hilo viejo, pero el problema sigue ahí. Entonces, aquí está la solución para eso.

ssh2_connect() utiliza socket_connect(). socket_connect se basa en el parámetro de configuración php ini default_socket_timeout que está configurado por defecto para 60 segundos (http://php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout)

Por lo tanto, la forma más fácil de resolver nuestro problema es cambiar la configuración ini en tiempo de ejecución a un valor que queremos, y de vuelta al valor establecido en el archivo ini para evitar afectar otras partes de nuestro software. En el siguiente ejemplo, los nuevos valores se establecen en 2 segundos.

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

Puede encontrar más detalles sobre cómo ssh2 para php funciona mediante la lectura del código fuente de libssh2 (https://github.com/libssh2/libssh2).

Cuestiones relacionadas