2014-02-14 2 views
-1

Добрый день!PHP - echo before exec()

У меня возникли некоторые проблемы с получением эха-заявления для вывода перед выполнением ехеса()

<? 
    if (isset($_POST['ipaddress'])) { 
     $escaped_command = escapeshellcmd($_POST['ipaddress']); 

     if(filter_var($escaped_command, FILTER_VALIDATE_IP)) { 
      echo "Gleaning ARP information, please wait.."; 
      $command = exec('sudo /sbin/getarp.exp'); 

эха утверждения того, выдаваемый после выполнения команды $. Время выполнения может составлять от 15 до 30 секунд в зависимости от того, насколько велика таблица ARP на удаленном маршрутизаторе. Есть ли порядок операций, о котором я не знаю? Похоже, что все утверждения внутри оператора if выполняются параллельно, а не по строкам, как я предполагал.

Я бы предпочел не предоставить решение, но некоторые документальные ссылки, которые приведут меня к поиску решения. Я искал то, что мог, но не смог найти жизнеспособное решение.

Любая помощь будет оценена по достоинству.

Спасибо.

ответ

1

В PHP существует понятие «буферизация вывода».

Всякий раз, когда вы выводите что-либо (например, используя echo, print и т. Д.), Текст бросается в буфер. Этот буфер отправляется только в определенное время (например, в конце запроса или при заполнении буфера).

Чтобы очистить буфер (для «промывки»), вам необходимо сделать это вручную. Функция flush() сделает это. Иногда вам также нужно позвонить ob_flush() (это если вы сами открыли пользовательские выходные буферы). Как правило, это хорошая идея, чтобы просто назвать обе функции и сделать с ней:

echo 'Wait a few seconds...'; 
flush(); ob_flush(); 
sleep(3); 
echo ' aaand we are done!'; 

См Output Buffering Control для получения дополнительной информации о буферизации вывода в PHP.

+0

Ссылка на управление буфером вывода - это то, что мне нужно, чтобы найти решение. – user2540821

4

Это происходит из-за того, что сценарий будет работать полностью до того, как любой результат/вывод будет отправлен в браузер.

+1

В качестве продолжения вы можете использовать Javascript для написания сообщения до того, как будет выполнен запрос на ваш PHP-скрипт. – Aquillo

+0

У меня были файлы php, прежде чем они будут печататься правильно, когда вы вызываете эхо, но я не уверен, как это сделать. Я думаю, что некоторые заголовки были отправлены? –

+0

@DamienBlack Сколько времени понадобилось для выполнения всего скрипта? –

0

Возможно, это проблема с выходным буфером. PHP-буферы выводят и записывают его в браузер в кусках. Попробуйте добавить вызов к ob_flush() между эхом и exec(); это заставит PHP написать текущее содержимое буфера в браузере.

+0

Возможно, лучше запустить запрос Ajax. –

+0

Хорошая точка. В противном случае пользователь будет сидеть там с половинной загруженной страницей во время выполнения инструкции exec(). – greenie2600

+0

Да. И у вас будут проблемы с перекрестным браузером при сглаживании (к сожалению). –

0

По умолчанию php не отправляет какой-либо вывод, пока скрипт php не будет запущен полностью. Есть решение. Тем не менее, я слышал, что это зависит от браузера. Я хотел бы проверить его на различных системах и браузерах, чтобы увидеть, если он работает:

ob_implicit_flush (true) 

Put, что перед любой из ваших команд/печати эхо, и это должно позволить что-либо печатное показать прямо в браузере.

Более универсальный подход заключается в интеграции вашей страницы с асинхронным javascript. Процесс, обычно называемый «AJAX». Это немного сложнее, потому что для этого требуется использование многих взаимодействующих скриптов, некоторых клиентских и некоторых серверных. Тем не менее, AJAX - это дефакто-способ сделать такую ​​вещь в Интернете.