PHP: Вывод результатов bash команды построчно в браузере
Для того что бы в коде php дернуть какую-то bash команду и вывести результаты, можно воспользоваться shell_exec()
, но что делать если нужно видеть в реальном времени весь вывод по мере выполнения скрипта.
На днях задался вопросом, как выполнить скрипт или команду на linux сервере, которая генерирует много сообщений и наблюдать все сообщения в реальном времени в браузере.
Для начала объявим функцию:
function disable_ob() {
// Выключить буферизацию вывода
ini_set('output_buffering', 'off');
// Выключаем сжатие вывода
ini_set('zlib.output_compression', false);
// Очистить буферы вывода
ini_set('implicit_flush', true);
ob_implicit_flush(true);
while (ob_get_level() > 0) {
// Получить текущие уровень вывода
$level = ob_get_level();
// Закончить буферизацию
ob_end_clean();
// Прерваться, если текущий уровень не изменился (новая строка не появилась)
if (ob_get_level() == $level) break;
}
// Отключаем буферизацию и сжатие для Apache
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', '1');
apache_setenv('dont-vary', '1');
}
}
Она очищает буфер вывода после каждой новой строчки.
Дальше в коде вызываем эту функцию и объявляем команду, которую будем выполнять (я взял для примера ping):
disable_ob();
$command = 'ping 8.8.8.8';
Для того, что бы результат выглядел нормально, следующую конструкцию нужно обернуть тэгами <pre> ... </pre>
<?php
system($command);
?>
При открытии страницы вы увидите результаты пингов на DNS сервер 8.8.8.8
в реальном времени.