Зависание потока PHP ssh2_exec

Я пытался запустить ssh2_exec и вернуть ответ с удаленного хоста, но не могу понять, как это сделать правильно. Я объединил эту функцию на основе того, что рекомендовали другие, но функция всегда зависает, как только достигает stream_get_contents($errorStream);.

Я запускаю команду ls -l, поэтому она должна выполняться очень быстро.

public function exec($command) 
{
    $stream = ssh2_exec($this->ssh, $command);

    if (! $stream) {
        throw new exception('Could not open shell exec stream');
    }
    $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

    stream_set_blocking($errorStream, true);
    stream_set_blocking($stream, true);

    $err      = stream_get_contents($errorStream);
    $response = stream_get_contents($stream);

    @fclose($errorStream);
    @fclose($stream);

    if ($err) {
        throw new exception($err);
    }

    return $response;
}

person Ian    schedule 28.01.2013    source источник


Ответы (2)


Я обнаружил, что функция ssh2_exec() будет зависать, если размер вывода команды достигнет 64 КБ (именно это число в моем ящике разработчика Linux).

Один из способов избежать — использовать: stream_set_timeout()

$stream = ssh2_exec($this->ssh, $command);

if (! $stream) {
    throw new exception('Could not open shell exec stream');
}

stream_set_timeout($stream, 10);
person greatmorro    schedule 26.06.2014

Честно говоря, я бы использовал phpseclib, реализацию SSH на чистом PHP. например.

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('ls -l');
person neubert    schedule 31.01.2013