2012-06-10 6 views
2

Прямо сейчас у меня есть код следующим образом.Показать вывод, полученный из shell_exec, и отобразить его в режиме реального времени, а не после ожидания 5-7 минут

$output = shell_exec(!-- unix commands are here --!); 
echo $output; 

У меня есть веб-сайт, на котором после нажатия на определенную кнопку выводится сценарий оболочки и отображается в браузере. Это прекрасно работает. Единственная проблема заключается в том, что я не могу видеть, что происходит с выходом до его завершения. Мне нужно подождать около 5-7 минут, а затем я вижу около ста строк вывода. Я пытаюсь вывести вывод в браузер по мере выполнения вывода - я хочу видеть, как результат происходит в реальном времени (в браузере).

Я пытался использовать popen, proc_open, flush(), ob_start и т.д. Кажется, ничего не работает. Я просто попытался открыть текстовый файл, записать содержимое вывода в текстовый файл и постепенно почитать текстовый файл в цикле. Я новичок php, поэтому вполне возможно, что я не использовал какой-либо из вышеперечисленных методов.

Каков самый простой способ выполнить это?

+0

Существует не менее двух мест, где данные могут зависеть от буферизации - PHP для клиента и команды для PHP. Я уверен, что несколько минут с руководством по PHP могут показать правильный ответ для части PHP для клиентов, но вам также может понадобиться сделать что-то для команды для части PHP. Какие команды конкретно вы пытаетесь использовать? – sarnold

ответ

1

Поскольку PHP запускает exec, system, pass_thru и т. Д. В режиме блокировки, вы очень ограничены в возможностях. PHP потребуется код для завершения выполнения, прежде чем переходить на протяжении всего сценария, если вы делаете что-то вроде добавить следующие строки в команде:

"> /dev/null 2>/dev/null &" 

Конечно, это будет остановить вывод команды, но .. возможно что-то вроде:

exec('command > /cmd_file 2>/cmd_file &'); 

$file = fopen('/cmd_file', 'r'); 
while (!feof($file)) { 
    echo fgets($file); 
    sleep(1); 
} 

fclose($file); 

Удачный выбор.

+0

Итак, где у вас есть «команда» в exec, предположительно, где будет введен мой скрипт оболочки, не так ли? –

+1

да не работает –