Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用phpseclib在Laravel中实时SSH输出_Php_Laravel_Ssh_Real Time_Phpseclib - Fatal编程技术网

使用phpseclib在Laravel中实时SSH输出

使用phpseclib在Laravel中实时SSH输出,php,laravel,ssh,real-time,phpseclib,Php,Laravel,Ssh,Real Time,Phpseclib,我尝试了不同的SSH库,但它们在Laravel中似乎工作得不太好。既然我让phpseclib工作得很好,我就努力坚持下去。但是,我没有看到从SSH连接获得实时输出的方法 我计划运行的某些事情可能需要几个小时才能完成,但正在访问的软件总是打印出我希望在浏览器中显示的完成百分比 目前,我有: <?php use phpseclib\Net\SSH2; use phpseclib\Crypt\RSA; $key = new RSA(); $key-&g

我尝试了不同的SSH库,但它们在Laravel中似乎工作得不太好。既然我让phpseclib工作得很好,我就努力坚持下去。但是,我没有看到从SSH连接获得实时输出的方法

我计划运行的某些事情可能需要几个小时才能完成,但正在访问的软件总是打印出我希望在浏览器中显示的完成百分比

目前,我有:

    <?php

    use phpseclib\Net\SSH2;
    use phpseclib\Crypt\RSA;

    $key = new RSA();
    $key->loadKey(file_get_contents('key.pem'));

    $command = 'ping google.com';

    $ssh = new SSH2('awesomeserver.com');

    if (!$ssh->login('username', $key))
    {
        echo 'Login Failed';
    }
    else
    {
        echo $ssh->exec($command);
    }

    ?>
但是,$proc只被识别为一个字符串而不是一个资源,所以它不起作用

除了使用不同的图书馆,你们还有什么其他建议吗

谢谢

编辑部分解决方案:

我最终通过使用read函数实现了这个脚本: 而@ob_end_flush

    $proc = $ssh->exec($command);

    while(!feof($proc))
    {
        echo fread($proc, 4096);
        @ flush();
    }
    $ssh->write($command.'\n');

    while($read = $ssh->read())
    {
        echo $read;
        @ flush();
    }

你可以给员工回电话。例如

$ssh->exec('ping 127.0.0.1', function($output) {
    echo $output;
});

我做到了。不幸的是,它会等到给出完整响应后才输出。由于我运行的程序运行数小时,每隔几秒钟就会更新一次,因此我只会得到一个超时错误。@Cod nerd-flush/ob_flush可能会有所帮助,但最终这将取决于您使用的Web服务器Apache、nginx等,您使用的SAPI CGI、Apache模块等与exec函数不兼容。但是,它确实与读取功能一起工作。但是,我的服务器现在超时了脚本。英雄联盟不过没关系。无论如何,我不应该让一个PHP脚本运行那么长时间。你的部分解决方案对我也适用,只是每次回显和循环之间大约需要10秒,如果上次回显后没有输出,则退出。我试图设置$ssh->setTimeout1,但当在那一秒钟内没有输出任何内容时,它就会退出循环。我想知道你怎么能让它每1或2秒检查一次,直到它全部说出来和完成后才退出循环。。。可能检查循环条件中的提示。。。