2015-04-23 98 views
4

所以我做一件簡單的事情,首先我通過ssh2_exec執行命令(成功驗證後),然後在變量中讀取答案。我以下(無身份驗證)feof生成無限循環

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 :[確定]啓動httpd:[確定]

但是,當我嘗試爲insta NCE到沒有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。

+0

在您的代碼的重寫版本中,您是否總是進入「$ output。=」或其他情況?如果是sudo有什麼區別,你可以做一個權限檢查嗎?總的來說,無效循環可能是由一個糟糕的「停止標準」(「停止狀態」,「cas d'arrêt」)引起的,或者是由於下一次迭代的不良增量/步驟而導致的。也許回答這些問題會對你有所幫助。祝你好運 –

+0

謝謝你的迴應。有時'fgets($ stdout_stream)'返回false,即使最終成功執行命令,所以當我知道命令執行不當時,我不能指望它。 Auth_User具有重新啓動httpd服務的權限。 –

+0

「Auth_User」組是「www-data」的一部分嗎? (chown) –

回答

0

我決定相信這將足夠〜2秒到我的服務器來檢查是否存在錯誤。並且萬一爲secod循環設置了最大時間。所以我的代碼如下。它執行的比我想要的更多...

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;