2015-04-23 6 views
4

Итак, я делаю одну простую вещь, во-первых, я выполняю команду через ssh2_exec (после успешной аутентификации), а затем читаю ответ в переменной. Мой код ниже (без Authenticate)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; 

Например я пытаюсь выполнить такие ЦМД:

sudo service httpd stop && sudo service httpd start 

Так что, когда команда выполняет хорошо все хорошо, ответ

Выключение HTTPD : [OK] Запуск httpd: [OK]

Но когда я пытаюсь установить insta сть выполнить такую ​​команду без Судо

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, который делает разницу, вы можете сделать проверку разрешений? В общем случае бесконечные петли могут быть вызваны плохим «критерием остановки» («stop case», «cas d'arrêt») или неправильным шагом/шагом к следующей итерации. Возможно, ответы на эти вопросы помогут вам. Удачи –

+0

Благодарим за отзыв. Иногда 'fgets ($ stdout_stream)' возвращает false, даже когда команда выполняется успешно в конечном счете, поэтому я не могу рассчитывать на это, когда знаю, что команда не будет работать хорошо. У Auth_User есть разрешения для перезапуска службы httpd. –

+0

Является ли «www-data» частью группы «Auth_User»? Если нет, возможно, предоставление www-данных прав на выполнение httpd будет делать трюк. (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;