feof генерирует бесконечный цикл

Поэтому я делаю одну простую вещь: сначала выполняю команду через 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 сек на мой сервер, чтобы проверить, есть ли ошибки. И на всякий случай установите максимальное время для цикла 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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]