php exec, как видеть прогресс

У меня есть php-скрипт, который запускает 2 exec.

exec(".....", $output, $return1); echo $return1; exec(".....", $output, $return2); echo $return2; 

Этот 2 exec выполняет 1 минуту для запуска. Когда я запускаю этот скрипт, я жду 2 минуты, и результат «00». Это нормально, но я хотел бы видеть $return1 ; через 1 минуту и ​​увидеть $return2 через 1 минуту. Я должен использовать Ajax / js? Фактически, я бы сделал индикатор выполнения, когда первый exec был выполнен => 50%, когда второй exec выполнен => 100%

Большое спасибо за вашу помощь!


Начальное решение:

Что-то вроде этого :

define.php:

 setInterval(function() { $.ajax({ type: "GET", url: 'convert.php?file='+id_file, cache:false, success:function(result){ $('.content_box').html(result); } }); }, 3000); 

Convert.php:

 exec(convert id_file.pdf id_file.jpg, $output, $return1); echo $return1; exec(convert -resize50x50 id_file.jpg id_file_thumb.jpg, $output, $return2); echo $return2; 

Но он работает без обратного вызова и без остановок!

Да, вы должны использовать AJAX – просто сохраните свой скрипт как есть, и вам понадобится другой скрипт, который сообщает о ходе и / или частичных результатах исходного сценария. Оригинальный скрипт может использовать $ _SESSION для передачи информации о результатах прогресса / частичных результатов, это самое простое решение.

Или вы можете использовать запрос AJAX не только для отчета о ходе / частичных результатах, но и для запуска этапа поэтапно, как, вероятно, предлагает Zar. Но этот подход менее гибкий; могут быть некоторые глобальные данные, которые разделяют этапы, поэтому лучше, если они оба находятся в рамках одного запуска скрипта. Таким образом, подход, который я набросал в 1-м параграфе, более жизнеспособен.

Вы могли бы сделать это в javascript и AJAAX, действительно. Посмотрите на setTimeout() и AJAX.

Вы можете указать данные GET или POST, чтобы сервер знал, какую функцию следует выполнять.

Нет способа контролировать, когда PHP возвращает результаты. Лучший вариант – выполнить один из них, а затем вернуть это. Как только первый из них запустит, установите его, а затем запустите второй.

Если exec() 'ed apps выводит информацию о ходе работы, вы даже можете получить это: Классически мы делаем это с помощью трюка перенаправления:

Сначала создайте сценарий оболочки, например

 #!/bin/bash $OUTFILE=$1 shift your_executable "$@" > $OUTFILE & echo $! 

тогда

  • Создать (закрытый) файл temp
  • exec() скрипт с именем temp filename в качестве первого параметра и сохранение возвращенного PID
  • Теперь опросите временный файл, всякий раз, когда вы находите новые строки, echo их и fflush()
  • Когда процесс с сохраненным pid завершен, выйдите из сценария