5

最初に ssh2_exec を介してコマンドを実行し (認証が成功した後)、変数で回答を読み取ります。以下の私のコード(認証なし)

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 を実行しようとします。

sudo service httpd stop && sudo service httpd start

したがって、コマンドが正常に実行されると、すべてが良好で、応答は

httpd のシャットダウン: [ OK ] httpd の起動: [ OK ]

しかし、たとえば、sudoなしでそのようなコマンドを実行しようとすると

service httpd stop && service httpd start

サーバーが「コマンドが見つかりません」などのようなことを言っていることは知っていますが、このエラーを取得できません。このスクリプトは無限に実行されます。

この方法でコードを書き直そうとしました(またはこれに似た別の方法)

    $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.

PHP 5.3 を使用しています。

4

2 に答える 2

0

エラーが存在するかどうかを確認するには、サーバーで2 秒程度で十分だと考えることにしました。念のため、秒ループの最大時間を設定します。だから私のコードは以下のとおりです。それは私が望む以上に実行します...

    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;
于 2015-04-24T12:09:47.893 に答える