Есть простой вариант, есть сложный.
Простой: выполняете команду через proc_open(), читаете из открытого командой потока и выдаете на страницу с помощью echo. После каждый выдачи делаете flush() для передачи результата на страницу. Сама страница при этом будет висеть «недозагруженной», коннект с сервером будет открыт и по мере работы скрипта будут подгружаться новые данные. Плюс — в простоте, минусы в ограничениях по вёрстке (чем проще страница — тем лучше). Если браузер, промежуточный прокси-сервер или веб-сервер настроены разрывать открытое соединение через какое-то время, способ будет работать на не очень долгих командах.
Более сложные варианты связаны с AJAX: либо то же самое соединение открываем уже из JavaScript и подгружаем на страницу результаты — так можно сделать более сложную верстку, либо делаем совсем сложно, складываем результат исполнения команды в файл на сервере, пишем скрипт на php, который частями отдает его нашему JavaScript-у, который отображает его на странице.