首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有限元生成无限回路

有限元生成无限回路
EN

Stack Overflow用户
提问于 2015-04-23 13:01:12
回答 2查看 833关注 0票数 5

所以我做了一件简单的事情,首先我通过ssh2_exec执行命令(成功验证后),然后用变量读取答案。下面的代码(没有身份验证)

代码语言:javascript
复制
try {
        $stdout_stream = ssh2_exec($this->connection, $_cmd);
        $stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
    } catch (Exception $e) {
        $std_output = $e->getMessage();
        return false;
    }

    $output = "";

    while (!feof($stdout_stream)) {
        $output .= fgets($stdout_stream, 4096);
    }

    while (!feof($stderr_stream)) {
        $output .= fgets($stderr_stream, 4096);
    }

    fclose($stdout_stream);
    fclose($stderr_stream);     

    return $output;

例如,我尝试执行这样的cmd:

代码语言:javascript
复制
sudo service httpd stop && sudo service httpd start

因此,当命令执行得很好时,响应是

关闭httpd: OK启动httpd: OK

但是当我尝试执行这样的命令时,没有sudo

代码语言:javascript
复制
service httpd stop && service httpd start

我知道服务器说的是“命令找不到”之类的东西,但我无法得到这个错误,这个脚本会无限地执行。

我试图以这种方式重写我的代码(或者另一种类似的方式)。

代码语言:javascript
复制
    $dataString = fgets($stdout_stream);
        if($dataString == "\n" || $dataString == "\r\n" || $dataString == "") {
            //var_dump("Empty line found.");
        }

        if($dataString === false && !feof($stdout_stream)) {
            //var_dump("not string");
        } elseif($dataString === false && feof($stdout_stream)) {
            //var_dump("We are at the end of the file.\n");
            break;
        } else {
            //else all is good, process line read in
            $output .= $dataString;
        }
    }

但结果是一样的。

所以问题是,我们不能事先说是什么导致无限循环$stdout_stream$stderr_stream

我正在使用PHP5.3。

EN

回答 2

Stack Overflow用户

发布于 2015-04-24 12:09:47

我已经决定相信我的服务器有足够的2秒时间来检查是否存在错误。以防万一,为secod循环设置最大时间。下面是我的密码。它执行得比我想的要多..。

代码语言:javascript
复制
    try {
        $stdout_stream = ssh2_exec($this->connection, $_cmd);
        $stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
    } catch (Exception $e) {
        $std_output = $e->getMessage();
        return false;
    }

    $output = "";

    $start_time = time();
    $max_time = 2; //time in seconds

    while(((time()-$start_time) < $max_time)) {
        $output .= fgets($stderr_stream, 4096);
    }

    if(empty($output)) {
        $start_time = time();
        $max_time = 10; //time in seconds

        while (!feof($stdout_stream)) {
            $output .= fgets($stdout_stream, 4096);
            if((time()-$start_time) > $max_time) break;
        }
    }

    fclose($stdout_stream);
    fclose($stderr_stream);     

    return $output;
票数 0
EN

Stack Overflow用户

发布于 2020-02-03 02:10:18

孩子,我很高兴我找到了这个!我也有同样的问题。我最终就这样解决了。

而不是:

代码语言:javascript
复制
while (!feof($stdout_stream)) {
    $output .= fgets($stdout_stream, 4096);
}

while (!feof($stderr_stream)) {
    $output .= fgets($stderr_stream, 4096);
}

这样做:

代码语言:javascript
复制
while (!feof($stdout_stream) || !feof($stderr_stream)) {
    $output_stdout .= fgets($stdout_stream, 4096);
    $output_stderr .= fgets($stderr_stream, 4096);
}

技术细节超出了我的范围,但这两个描述符似乎同时关闭,而不是一次一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29824229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档