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。
在您的代碼的重寫版本中,您是否總是進入「$ output。=」或其他情況?如果是sudo有什麼區別,你可以做一個權限檢查嗎?總的來說,無效循環可能是由一個糟糕的「停止標準」(「停止狀態」,「cas d'arrêt」)引起的,或者是由於下一次迭代的不良增量/步驟而導致的。也許回答這些問題會對你有所幫助。祝你好運 –
謝謝你的迴應。有時'fgets($ stdout_stream)'返回false,即使最終成功執行命令,所以當我知道命令執行不當時,我不能指望它。 Auth_User具有重新啓動httpd服務的權限。 –
「Auth_User」組是「www-data」的一部分嗎? (chown) –