我在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 commandn";
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;
}
对于想知道如何设置超时的人,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;
以下是如何使用phpseclib实现这一点,phpseclib是一个纯PHP SSH2实现:
<?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()
。
AFAIK,php ssh2规范中没有真正的"超时"实现。
我为这个问题找到的唯一解决方案可以在这里的这篇文章中找到:PHP ssh2_connect()实现超时