Индикатор выполнения для bash-скрипта, запущенного из переполнения стека

С неоценимой помощью людей из StackOverflow мне удалось запустить bash-скрипт из php. Сейчас все работает нормально, но так как сценарию требуется несколько минут до конца, я бы хотел увидеть прогресс. В скрипте bash есть несколько команд printf, которые выводят сообщения об ошибках / успехах.

Как новичок в php, я предполагал, что эти сообщения будут появляться по мере их выполнения в скрипте bash. Но я не получаю никакого вывода, хотя скрипт завершен. Я могу видеть созданные файлы и наверняка сценарий завершен, но я не могу увидеть вывод php в браузере.

Как я могу проверить прогресс, когда скрипт еще работает? Почему php не заканчивается?

Ниже приведен скрипт php.

<?php

echo "<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8 />
<title>Title</title>
<link href=../style.css rel=stylesheet type=text/css>
</head>
<body topmargin=0 leftmargin=0>";
echo '<font color=blue>';

echo '------------------------------------------------------------- <br>';
echo 'Inicio de la generación manual de mapas de olas de calor<br>';
echo 'Este proceso tarda varios minutos<br>';
echo '-------------------------------------------------------------<br>';
echo date('h:i:s') . "\n";
$output = shell_exec('/home/meteo/www/RAMS/olas/generar-mapas.bash');
echo "<pre>".$output."</pre>";
echo '</font>';
echo '</body>';
echo '</html>';

?>

Я прочитал несколько постов на форуме о php, Ajax и jQuery для индикаторов выполнения, но я просто знаю некоторые очень простые php. Есть ли простое решение для новичка в php?
Спасибо за вашу помощь

0

Решение

shell_exec() блоки до завершения дочернего процесса, используйте popen() вместо:

$p = popen('/home/meteo/www/RAMS/olas/generar-mapas.bash', 'r');
while(!feof($p)) {
echo fgets($p);
ob_flush();
flush();
}
pclose($p);
1

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

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

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