Я считаю, что проблема в том, что у вас есть цикл ожидания ввода.fgets
вернет false только в том случае, если встретится с EOF.В противном случае он возвращает строку, которую прочитал;поскольку перевод строки включен, он не возвращает ничего, что может быть приведено к ложному.Вместо этого вы можете использовать stream_get_line()
, что не возвращает символ EOL.Обратите внимание, что для этого все равно потребуется, чтобы ваша команда возвращала пустую строку после ее вывода, чтобы она могла вычислять значение false и прерывать цикл while.
<?php
$prog = "gcloud compute ssh yellow";
$commands = ["ls -la", "cd /home", "ls", "sudo ifconfig", "ls -l"];
$descr = [0 => ['pipe','r'], 1 => ['pipe','w'], 2 =>['pipe','w']];
$pipes = [];
$process = proc_open($prog, $descr, $pipes);
if (is_resource($process)) {
sleep(2);
foreach ($commands as $command) {
fputs($pipes[0], $command . PHP_EOL);
while ($f = stream_get_line($pipes[1], 256)) {
echo $f . PHP_EOL;
}
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}
Другой вариант - собрать выходные данные.вне цикла, хотя для этого потребуется проанализировать выходные данные, если вам необходимо знать, какие выходные данные получены от какой команды.
<?php
$prog = "gcloud compute ssh yellow";
$commands = ["ls -la", "cd /home", "ls", "sudo ifconfig", "ls -l"];
$descr = [0 => ['pipe','r'], 1 => ['pipe','w'], 2 =>['pipe','w']];
$pipes = [];
$process = proc_open($prog, $descr, $pipes);
if (is_resource($process)) {
sleep(2);
foreach ($commands as $command) {
fputs($pipes[0], $command . PHP_EOL);
}
fclose($pipes[0]);
$return = stream_get_contents($pipes[1]);
$errors = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}