У меня есть PHP-файл, который запускает команду на Linux с помощью shell_exec()
, Для выполнения этой команды требуется некоторое время, и на каждом этапе она что-то печатает. Я хочу, чтобы php отображал каждую строку, напечатанную командой на данный момент это напечатано.
Я узнал, используя ob_flush()
а также flush()
, можно сделать такие чанкованные http ответы, но я не могу повторить строки, так как они напечатаны, потому что shell_exec()
ожидает завершения команды и возвращает результат. Таким образом, строки выводятся после завершения команды все сразу.
Я считаю, что я должен избегать использования shell_exec()
для такой цели. Как еще я могу достичь этого?
<?php
$cmd = "ping www.google.com";
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
Вам нужно очистить буфер вывода, чтобы сразу его напечатать:
echo "hello world\n";
flush();
Проверьте документацию flush()