У меня есть 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 $!
тогда
exec()
скрипт с именем temp filename в качестве первого параметра и сохранение возвращенного PID echo
их и fflush()