PHP:通过使用proc_open(“ssh hostname';tail-F~somefile';”实现死锁
我需要通过php(使用phpunit)通过ssh跟踪文件状态。但当我尝试启动此代码时:PHP:通过使用proc_open(“ssh hostname';tail-F~somefile';”实现死锁,php,ssh,proc-open,Php,Ssh,Proc Open,我需要通过php(使用phpunit)通过ssh跟踪文件状态。但当我尝试启动此代码时: $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,
$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);
什么也没发生-没有输出,我猜死锁被破坏了:脚本不会退出。
你有什么想法吗?还是建议?tail-F实际上并没有“结束”——它只是在输出可用时继续转储输出。这可能就是问题所在。它在fgets()上阻塞 我的建议是:使用。例如
虽然从实施的角度来看,现在。。。它看起来也没有为你提供任何提前退出的机制。如果像“如果packet\u handler返回false,那么exec()停止运行”之类的话,那就太好了
我想你可以用
->setTimeout()
ty来代替这个答案。我猜是我的错,我认为“proc_open”执行命令时使用了类似于守护该命令的东西。为此,您可能必须执行类似于nohup
的操作。但即便如此,我的期望是,无论是OpenSSH还是phpseclib,它们都会立即返回,而不会给您任何类型的输出。。我一直在谷歌上搜索解决方案,我看到的都是你那一模一样的愚蠢的复制粘贴答案。。这并不适用于任何地方。@Pamblam-伙计,你在评论一篇两年前的帖子。下一步是什么?也许你应该去发帖告诉我应该升级,因为我正在使用的图书馆已经过时三年半了(这恰好是那篇帖子的年代)@Pamblam-此外,我的答案并不妨碍其他人发布他们自己的“更好”答案。如果你认为一个问题没有令人满意的答案,那么你可以悬赏这个问题以引起人们的注意,然后悬赏这个答案。
<?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');
?>