Urichalex
@Urichalex
Кратко о себе)

Как установить таймаут для ssh2_exec?

Приложение работает с удаленным сервером по SSH.
Иногда бывает так, что ответ от сервера очень долгий (больше минуты), и, соответственно, приложение висит, пока не получит ответ.
Мне нужно как-то организовать таймаут ответа, чтобы, если ответа нет больше 5 секунд, возвращать скажем пустой ответ.

Пробовал использовать
set_time_limit(5);
ini_set("default_socket_timeout", 5);
stream_set_timeout($ssh, 5);

Не помогает...
function sshExec($command)
{
    $ssh = ssh2_connect('host', 22);

    ssh2_auth_password($ssh, 'user', 'password');

    $rStream = ssh2_exec($ssh, $command);
    $rErrorStream = ssh2_fetch_stream($rStream, SSH2_STREAM_STDERR);
    stream_set_blocking($rErrorStream, true);
    stream_set_blocking($rStream, true);

    $response = stream_get_contents($rStream);
    $error = stream_get_contents($rErrorStream);

    fclose($rErrorStream);
    fclose($rStream);

    return [
        'response' => $response,
        'error' => $error
    ];
}
  • Вопрос задан
  • 601 просмотр
Пригласить эксперта
Ответы на вопрос 1
peter23
@peter23
Во-первых, нужно понять на каком этапе вам нужен таймаут.
ssh2_connect не поддерживает настройку таймаута и с этим ничего не сделать. Выход - использовать что-то другое, например phpseclib.
Для ssh2_exec вы можете отслеживать таймаут самостоятельно. Примерно так:
$timeout = 30;
$timeStart = time();
while(!feof($rStream)) {
	echo fread($rStream, 1024);  //stdout
	echo fread($rErrorStream, 1024);  //stderr
	if((time() - $timeStart) > $timeout) {
		//timeout
		break;
	}
	usleep(100);  //prevent cpu overload
}

Ну и вызовы stream_set_blocking нужно убрать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы