1

碰巧我需要通过 ssh 通过 php(使用 phpunit)跟踪文件状态。但是当我尝试启动此代码时:

$descriptorspec = array(
  0 => array('pipe', 'r'),
  1 => array('pipe', 'w'),
  2 => array('pipe', 'w'),
);

$cmd = "ssh hostname 'tail -F ~/test.file'";

$proc = proc_open($cmd, $descriptorspec, $pipes, null);

$str = fgets($pipes[1]);
echo $str;
if (!fclose($pipes[0])) {
  throw new Exception("Can't close pipe 0");
}
if (!fclose($pipes[1])) {
  throw new Exception("pipe 1");
}
if (!fclose($pipes[2])) {
  throw new Exception("pipe 2");
}
$res = proc_close($proc);

什么也没有发生 - 没有输出,我猜死锁已被执行:脚本没有退出。有什么想法吗?或建议?

4

1 回答 1

0

tail -F实际上并没有“结束” - 它只是在输出可用时不断转储。这大概就是问题所在。它阻塞了 fgets()。

我的建议:使用phpseclib,一个纯 PHP SSH2 实现。例如。

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

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

function packet_handler($str)
{
    echo $str;
}

$ssh->exec('tail -F ~/test.file', 'packet_handler');
?>

尽管正在查看实现,但现在......它看起来也没有为您提供任何过早退出的机制。如果它像“如果 packet_handler 返回 false 则 exec() 停止运行”之类的,那就太好了。

我想你可以使用->setTimeout().

于 2013-11-08T20:23:20.350 回答