stream_set_timeout不适用于PHP中的ssh2_exec

时间:2013-07-04 10:50:02

标签: php ssh stream timeout

我在尝试为PHP中的ssh2_exec连接设置超时时遇到问题,因此当运行命令时出现错误时,它将释放执行线程并且不会阻塞整个网站。我试过stream_set_timeout($stream,$seconds),但似乎没有按预期工作。

对此有什么想法吗?

//run specified command (ssh)
    function runCMD($cmd){
        if (!($stream = ssh2_exec($this->conn, $cmd )))
        {
            echo "fail: unable to execute command\n";
            fclose($stream);
            return ERROR_SSH_EXEC_COMM;
        }

        sleep(1);
        stream_set_timeout($stream,5);//>>not work
        stream_set_blocking($stream, true);
        $res = stream_get_contents($stream);

        return $res;
    }

3 个答案:

答案 0 :(得分:2)

对于想知道如何设置超时的人,php.ini中有一个default_socket_timeout变量,可用于设置当前会话中任何基于套接字的连接的超时。

您只需运行

即可查看
$timeStart = time();
ini_set("default_socket_timeout", 5);
$ssh = ssh2_connect('123.123.123.123');
echo (time() - $timeStart), PHP_EOL;

答案 1 :(得分:0)

以下是phpseclib, a pure PHP SSH2 implementation

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

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

$ssh->setTimeout(5);
echo $ssh->exec('whatever');
?>

如果您想在那之后执行后续命令,则需要执行$ssh->reset()

答案 2 :(得分:0)

AFAIK,php ssh2规范中没有真正的'超时'实现。

我在这篇文章中找到了解决这个问题的唯一解决方案: PHP ssh2_connect() Implement A Timeout